Flutter组件测试:如何Mock注入的CustomRouter依赖?
Flutter组件测试Mock依赖注入的CustomRouter方案
问题描述
我有一个用于返回上一页面的BackButton组件,其onPressed事件通过依赖注入的CustomRouter的pop方法实现。运行组件测试时出现如下错误:
Did you forget to register it?) 'package:get_it/get_it_impl.dart': Failed assertion: line 372 pos 7: 'instanceFactory != null'
组件代码如下:
class BackButton extends StatelessWidget { const BackButton({ Key? key, }) : super(key: key); @override Widget build(BuildContext context) { return CustomButton( label:'Back', icon: Icon.arrowLeft, onPressed: inject<CustomRouter>().pop, ); } }
解决方法
1. 创建Mock路由类
使用mockito库生成CustomRouter的Mock实现(若未添加依赖,需在pubspec.yaml的dev_dependencies中加入mockito和build_runner):
import 'package:mockito/mockito.dart'; class MockCustomRouter extends Mock implements CustomRouter {}
2. 测试前注册Mock实例
在测试代码的初始化阶段,将Mock实例注册到GetIt中,同时重置GetIt避免测试间状态污染:
import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; void main() { late MockCustomRouter mockRouter; setUp(() { GetIt.instance.reset(); mockRouter = MockCustomRouter(); GetIt.instance.registerSingleton<CustomRouter>(mockRouter); }); testWidgets('BackButton点击触发CustomRouter.pop', (tester) async { // 挂载组件 await tester.pumpWidget(const MaterialApp(home: Scaffold(body: BackButton()))); // 模拟点击按钮 await tester.tap(find.text('Back')); await tester.pump(); // 验证pop方法是否被调用 verify(mockRouter.pop()).called(1); }); }
3. 可选:测试后清理注册
若需要,可在测试结束后移除Mock实例的注册:
tearDown(() { GetIt.instance.unregister<CustomRouter>(); });
内容的提问来源于stack exchange,提问作者Nikhil Bharadwaj
相关产品推荐
相关产品推荐

