'No stub was found which matches the arguments of this method call

I'm writing a Unit test for my data source and face the problem No stub was found which matches the arguments of this method call

import 'dart:convert';

import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:true_food/core/constant.dart';
import 'package:true_food/core/network_manager.dart';
import 'package:true_food/features/home/data/datasources/home_data_source.dart';
import 'package:true_food/features/home/data/models/shelve.dart';
import 'package:true_food/features/home/data/models/shelve_banner_list.dart';
import 'package:true_food/features/home/domain/entities/banner_list_request_model.dart';

import '../../../../core/utils/fixture_reader.dart';
import 'home_data_source_test.mocks.dart';

@GenerateMocks([NetworkManager])
main() {
  late HomeDataSourceImpl dataSource;
  late MockNetworkManager mockNetworkManager;

  final successCode = 201;
  final shelveUrl = Constant.baseUrl + APIRoute.shelveList;
  final bannerUrl = Constant.baseUrl + APIRoute.bannerList;

  setUp(() {
    mockNetworkManager = MockNetworkManager();
    dataSource = HomeDataSourceImpl(mockNetworkManager);
  });

  void onCallSuccess(Function body) {
    group('Get list successfully', () {
      body();
    });
  }

  void onCallFailed(Function body) {
    group('Get list unsuccessfully', () {
      body();
    });
  }

  BannerListRequestModel request = const BannerListRequestModel(
      url:
          "/weshop/api/TRUEID_TRUEFOOD/shelfContent?type=item&sort=sequence&itemGroup=6183b134b6d93f000180bf76&page={sys.page}&size={sys.size}&publishStatus=true",
      location: BannerListRequestLocationModel(latitude: 0.0, longitude: 0.0),
      page: 0,
      size: 4);

  Future<void> makeResponseSuccessfull(dynamic data) async {
    final Response response =
        Response(requestOptions: RequestOptions(path: 'path'), statusCode: 200);
    when(mockNetworkManager.request(
      path: shelveUrl,
      method: Method.get,
      param: {
        "publishOnApp": true,
      },
      headers: null,
      isFormData: false,
      contentType: 'application/json',
      isFullPath: false,
      language: "th",
      date: null,
      file: null,
      check: false,
    )).thenAnswer((_) async => Right(response));
  }

  void makeBannerListResponseSuccessfull(dynamic data) async {
    final Response response = Response(
        requestOptions: RequestOptions(path: 'path'),
        statusCode: 200,
        data: data);
    when(mockNetworkManager.request(
      path: bannerUrl,
      method: Method.post,
      param: request.toMap(),
      headers: null,
      isFormData: false,
      contentType: 'application/json',
      isFullPath: false,
      language: "th",
      date: null,
      file: null,
      check: false,
    )).thenAnswer((_) async => Right(response));
  }

  onCallSuccess(() {
    test('should perform GET for get shelve list successfully', () async {
      final json = jsonDecode(fixture("shelve_list_data.json"));
      final List<ShelveModel> list =
          List<ShelveModel>.from(json.map((e) => ShelveModel.fromJson(e)));
      // arrange
      await makeResponseSuccessfull(json);
      // act
      final rs = await dataSource.getList(publishOnApp: true);
      // assert
      expect(rs, list);
    });

    test('should perform POST for get banner list successfully', () async {
      final json = jsonDecode(fixture("banner_list_data.json"));
      final List<ShelveBannerListModel> list = List<ShelveBannerListModel>.from(
          json.map((e) => ShelveBannerListModel.fromJson(e)));
      // arrange
      makeBannerListResponseSuccessfull(json);
      // act
      final rs = await dataSource.getBannerList(request: request);
      // assert
      expect(rs, list);
    });
  });
}

My NetworkManager class:

import 'dart:convert';
import 'dart:io';

import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import 'package:flutter_flavor/flutter_flavor.dart';
import 'package:injectable/injectable.dart';
import 'package:true_food/core/constant.dart';
import 'package:true_food/core/error/error.dart';
import 'package:true_food/core/error/exceptions.dart';
import 'package:true_food/core/local_storage.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:true_food/gen/locale_keys.g.dart';
import 'package:dio/adapter.dart';

@lazySingleton
class NetworkManager {
  final dio = Dio();

  Future<Either<ServerException, Response>> request({
    required String path,
    required Method method,
    Map<String, dynamic>? param,
    Map<String, dynamic>? headers,
    bool isFormData = false,
    String contentType = 'application/json',
    bool isFullPath = false,
    String language = 'vi',
    // ignore: avoid_init_to_null
    DateTime? date = null,
    // ignore: avoid_init_to_null
    FormData? file = null,
    bool check = false,
  }) async {
    final String? _token = LocalStorage().getString(Constant.accessToken);
    print('_token: $_token');
    String domain = FlavorConfig.instance.variables["baseUrl"] ?? '';
    String _finalPath = domain + path;
    Map<String, dynamic> _finalParam = {};
    if (param != null) {
      print(param);
      _finalParam.addAll(param);
    }
    try {
      Map<String, dynamic>? _header =
          _token != null ? {"Authorization": "Bearer " + _token} : null;
      Response response = Response(requestOptions: RequestOptions(path: path));
      Options optionsCommon = Options(
        headers: _header,
        sendTimeout: 30 * 1000,
        receiveTimeout: 30 * 1000,
        contentType: contentType,
      );
      //handle old printic with the request without content type
      switch (method) {
        case Method.get:
          response = await dio.get(
            _finalPath,
            queryParameters: _finalParam,
            options: optionsCommon,
            cancelToken: null,
            onReceiveProgress: null,
          );
          break;
        case Method.post:
          var data = isFormData ? file : _finalParam;
          response = await dio.post(
            _finalPath,
            options: optionsCommon,
            data: data,
            cancelToken: null,
            onReceiveProgress: null,
          );
          break;
        case Method.put:
          var data = isFormData ? file : _finalParam;
          response = await dio.put(
            _finalPath,
            options: optionsCommon,
            data: data,
            cancelToken: null,
            onReceiveProgress: null,
          );
          break;
        case Method.delete:
          var data = isFormData ? file : _finalParam;
          response = await dio.delete(
            _finalPath,
            options: optionsCommon,
            data: data,
            cancelToken: null,
          );
          break;
      }
      print('==> DIO SUCCESS <$path> RESPONSE :\n'
          '${response.data}');
      // onSuccess(response.data, response.statusCode ?? 200);
      return Right(response);
    } on DioError catch (e) {
      if (e.response != null) {
        final Response rp = e.response!;
        if (rp.statusCode == 502) {
          // showToast("Server is maintaining, please login later".tr());
          // UserManager.instance.logout();
          // EasyLoading.dismiss();
        }
        print('~~> e: ${e.error}');
        print('==> DIO FAILED <$path> RESPONSE :\n'
            '${e.response?.data ?? ""}');
        final data = rp.data;
        try {
          final json = jsonDecode(data);
          return Left(ServerException(appError: AppError.fromJson(json)));
        } on Exception {
          return Left(ServerException(
              appError: AppError(
                  status: 500,
                  title: LocaleKeys.something_went_wrong.tr(),
                  message: LocaleKeys.something_went_wrong.tr())));
        }
      } else {
        return Left(ServerException(
          appError: AppError(
            status: 500,
            title: LocaleKeys.something_went_wrong.tr(),
            message: LocaleKeys.something_went_wrong.tr(),
          ),
        ));
      }
    } on SocketException {
      return Left(ServerException(
          appError: AppError(
              status: 500,
              title: LocaleKeys.something_went_wrong.tr(),
              message: LocaleKeys.something_went_wrong.tr())));
    }
  }
}

enum Method { post, get, put, delete }

Pubspec:

Mockito version: "5.1.0"
Dio version  "4.0.5"

MissingStubError: 'request' No stub was found which matches the arguments of this method call: request({path: api/shelves, method: Method.get, param: {publishOnApp: true}, headers: null, isFormData: false, contentType: application/json, isFullPath: false, language: vi, date: null, file: null, check: false})

Add a stub for this method using Mockito's 'when' API, or generate the MockNetworkManager mock with a MockSpec with 'returnNullOnMissingStub: true' (see https://pub.dev/documentation/mockito/latest/annotations/MockSpec-class.html).



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source