Injectable测试环境下如何配合@GenerateMocks生成可用Mock类
解决方案
1. 生成合规的Mockito Mock类
无需手动编写Mock实现,首先在test目录下新建专属的Mock配置文件,比如test/mocks/injectable_mocks.dart,内容如下:
import 'package:mockito/mockito.dart'; import 'package:injectable/injectable.dart'; // 导入需要Mock的抽象类 import 'package:你的项目路径/domain/repositories/i_auth_repository.dart'; // 让Mockito自动生成支持匹配器的Mock类 @GenerateMocks([IAuthRepository]) import 'injectable_mocks.mocks.dart';
运行build命令生成Mock代码:
flutter pub run build_runner build --delete-conflicting-outputs
生成的MockIAuthRepository类原生支持any、anyNamed等Mockito匹配器语法。
2. 将生成的Mock类绑定到Injectable测试环境
自动生成的Mock类不能直接加注解,可以通过两种方式完成测试环境的依赖注册:
方式A:通过Injectable模块统一注册(适合全局复用Mock的场景)
在刚才的test/mocks/injectable_mocks.dart中添加测试环境注册模块:
@module @Environment('test') abstract class TestMockModule { @LazySingleton(as: IAuthRepository) IAuthRepository get mockAuthRepo => MockIAuthRepository(); }
Injectable初始化test环境时,会自动将生成的Mock类作为IAuthRepository的实现注入GetIt,无需额外手动操作。
方式B:动态覆盖注册(适合单测试用例定制Mock的场景)
如果不同测试用例需要不同的Mock实现,可以不在模块中注册,直接在测试的初始化逻辑中手动覆盖注入:
setUpAll(() async { configureInjection(Environment.test); // 手动覆盖注入生成的Mock实例,优先级高于原有配置 getIt.registerSingleton<IAuthRepository>(MockIAuthRepository(), override: true); });
3. 测试代码适配
原有测试逻辑基本不需要修改,仅需要在获取实例后做一次类型转换即可正常使用匹配器:
// 拿到的实例就是自动生成的MockIAuthRepository,完全兼容Mockito语法 final mockAuth = getIt<IAuthRepository>() as MockIAuthRepository; // 注意anyNamed的参数名要和方法定义的参数名完全一致,此处示例参数为email verifyNever(mockAuth.resetPassword(email: anyNamed("email")));
补充优化建议
- 有多个需要Mock的类时,直接在
@GenerateMocks的数组中添加对应抽象类,同时在TestMockModule中新增对应getter即可,所有注册逻辑会自动生成 - 不要手动编写带
Mock混入的实现类,全部交给Mockito生成可以完全避免匹配器不兼容的问题
内容的提问来源于stack exchange,提问作者Lloyd Richards
相关产品推荐
相关产品推荐

