問題
final Client _client; Future<Response> get(String relativeUrl, {Map<String, String> query}) async { final token = await _authenticationPreferences.getAccessToken(); final header = {'token': token}; _client.get( Uri.http(domain, relativeUrl, query), headers: header, ), ); }
このように定義しているメソッド(headerを付与してGETリクエストを送る)に対して、テストを行う。
group('ApiClient error handling', () { setUp(() async { //色々セットアップ }); test( 'when API return response with status code 401, [get] function should throw [UnauthorizedError]', () { when(mockHttpClient.get(any, headers: {})) .thenAnswer((_) => Future.value(Response('body', 401))); final getFuture = apiClient.get('401'); expect(getFuture, throwsA(isInstanceOf<UnauthorizedError>())); });
mockito | Dart Packageを用いてテストを行うと以下のようなエラーが帰ってきていてレスポンスが返却されない。
NoSuchMethodError: The getter 'statusCode' was called on null. Receiver: null Tried calling: statusCode
解決策
when(mockHttpClient.get(any, headers: anyNamed('headers'))) .thenAnswer((_) => Future.value(Response('body', 401))); final getFuture = apiClient.get('401'); expect(getFuture, throwsA(isInstanceOf<UnauthorizedError>()));
headers: anyNamed('headers')
ここが重要。
dart - Flutter/Mockito. Testing API provider with mockito, problem with api headers - Stack Overflow
こちらのStack Overflowによる実際のリクエストと合う形にしないとレスポンスが返却されないもよう。