Flutter testing with mockito and injectable

Viewed 115

I'm learing test writing with mockito but i have some problems with testing remote_data_source_class.

Here's my abstract class

abstract class ApiRemoteDataSource {
  Future<PokemonsListResponseModel> getPokemons();
}

Here's the implementation

import 'dart:convert';

import 'package:injectable/injectable.dart';
import 'package:http/http.dart' as http;

import '../../models/pokemons_list_response_model.dart';
import 'api_remote_data_source.dart';

@Injectable(as: ApiRemoteDataSource)
class ApiRemoteDataSourceImpl implements ApiRemoteDataSource {
  ApiRemoteDataSourceImpl(this.client);
  final http.Client client;
  final pokemonListUrl = Uri.parse('https://pokeapi.co/api/v2/pokemon');

  @override
  Future<PokemonsListResponseModel> getPokemons() async {
    final response = await client.get(pokemonListUrl);
    final data = response.body;

    final modelData = PokemonsListResponseModel.fromJson(json.decode(data));

    return modelData;
  }
}

Now Iwant to verify that when i invoke method .getPokemons() on mock data source my http.Client will execute a call to given endpoint:

@GenerateMocks([http.Client, ApiRemoteDataSource])
void main() {
  late ApiRemoteDataSource dataSource;
  late MockClient mockHttpClient;
  setUp(() async {
    await configureDependencies();
    mockHttpClient = MockClient();
    dataSource = MockApiRemoteDataSource();

    print('test: $mockHttpClient, data source $dataSource');
  });
  group('getPokemonsList', () {
    test('Should perform a GET request on a URL', () async {
      final url = Uri.parse('https://pokeapi.co/api/v2/pokemon');
      // arrange
      when(mockHttpClient.get(url, headers: anyNamed('headers')))
          .thenAnswer((_) async => http.Response(fixture('pokemon_list.json'), 200));
      // act
      dataSource.getPokemons();
      // assert
      verify(mockHttpClient.get(Uri.parse('https://pokeapi.co/api/v2/pokemon')));
    });

   
  });
}

Running test above gives me this error: "MissingStubError: 'getPokemons' No stub was found which matches the arguments of this method call: getPokemons()"

When i replace dataSource.getPokemons() in //act part with "mockHttpClient.get(url)" everything works but I'm not sure if that kind of test is valid

0 Answers
Related