ややめも

アプリ作りたいエンジニアのめも💁‍♀️

技術メモ
日記
つくったもの
就活の話

FlutterでMockitoを使うときにレスポンスが返却されない問題

問題

  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による実際のリクエストと合う形にしないとレスポンスが返却されないもよう。