Как бросить исключение при первом вызове и обычное возвращаемое значение на втором? - PullRequest
0 голосов
/ 30 января 2020

Мой код делает сетевые звонки. Иногда они терпят неудачу, и я реализовал retry logi c. Теперь я буду sh, чтобы проверить это с помощью модульного теста. Для этого я использую 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 голосов
/ 03 февраля 2020

Я понял это. Хитрость заключается не в использовании 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');
исходного примера
...