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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:35:21