用Mocktail模拟多次调用后的不同答案和异常



我正在使用mocktail进行单元测试,我找不到抛出的方法第一次调用的异常但之后,在第二次调用时,输出正确

我可以为两个不同的答案找到这个解决方案,但这还不足以测试抛出的异常。所以我需要想出一个改进的解决方案。

这就是我想要达到的。顺便说一下,我正在用http get测试连接重试。

import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart';
class MockClient extends Mock implements http.Client {}
final mockClient = MockClient();
//First time fails, second one retrieves a result. This doesn't work on Mocktail
when(() => mockClient.get(Uri.parse(url)))
.thenThrow(SocketException()) // Call 1
.thenAnswer((_) => Future.value(http.Response("page content", 200)) // Call 2
);

在尝试了不同的想法之后,一个可能的解决方案是将每个答案存储在一个List

import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart';
class MockClient extends Mock implements http.Client {}
final mockClient = MockClient();
final List<Future<http.Response> Function(Invocation)> answers = [
(_) => throw SocketException(),
(_) => Future.value(http.Response("page content", 200)),
];

when(() => mockClient.get(Uri.parse(url)))
.thenAnswer((invocation) => answers.removeAt(0)(invocation));
// Calling answers.removeAt(0) without the lambda method returns the same answer on all of them

本例中不使用Invocation,只检查2个连续呼叫。但是这种行为可以从你在这里看到的扩展。

我还没有在Mockito上尝试过,但它应该以类似的方式适应语法。

相关内容