【问题标题】:How to throw an exception upon first invocation and a regular return value on the second?如何在第一次调用时抛出异常并在第二次调用时抛出常规返回值?
【发布时间】:2020-01-30 13:47:50
【问题描述】:

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

【问题讨论】:

    标签: unit-testing dart mocking mockito


    【解决方案1】:

    我想通了。诀窍不是使用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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多