我的代码进行网络呼叫。有时这些方法失败了,我已经实现了一些retry逻辑。现在,我希望使用单元测试来对此进行测试。我为此使用Mockito。我在模拟这个特定的方法调用时遇到麻烦,这是我的测试代码:
var mock = MockHttpClient();
var answers = <Future<String>>[
Future.error(Exception('boom')),
Future.value('some return value'),
];
when(mock.getStuff()).thenAnswer((_) => answers.removeAt(0));
var client = Client(inner: mock);
var result = client.someCall(); // This method call uses the `inner` object to make the `getStuff` network call.
expect(result, 'some return value');
运行此代码将引发异常。而我得到的是因为第一个返回的Future
! Mockito有一个名为thenThrow
的适当方法调用,但我不知道如何将两者结合起来。
答案 0 :(得分:0)
我知道了。诀窍不是使用Mock
,而是使用Fake
。
看起来像这样:
class FakeHttpClient extends Fake implements HttpClient {
final List<Future<List<String>>> answers = [
Future.error(Exception('boom')),
Future.value('some return value'),
];
@override
Future<String> getStuff() {
return answers.removeAt(0);
}
}
然后使用FakeHttpClient
的实例作为原始示例的Client
的参数:
var fake = FakeHttpClient();
var client = Client(inner: fake);
var result = client.someCall(); // This method call uses the `inner` object to make the `getStuff` network call.
expect(result, 'some return value');