You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:36:04