如何在第一次调用时引发异常并在第二次调用时引发常规返回值?

时间:2020-01-30 13:47:50

标签: unit-testing dart mocking mockito

我的代码进行网络呼叫。有时这些方法失败了,我已经实现了一些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的适当方法调用,但我不知道如何将两者结合起来。

1 个答案:

答案 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');