用途:定义如何在 Dart 和 Flutter 测试中正确使用 mocktail 包进行 mocking。
对象选择:实际可行时优先用真实对象;不需要验证交互时优先用 Fake(extends Fake,只覆盖需要的方法);仅在需要验证调用次数、参数或桩动态响应时用 Mock(extends Mock)。继承 Mock 的类不得添加 @override 方法或实现;只有测试含 verify 断言时才用 mock,否则优先真实或 fake 对象。
创建 mock 与 fake:class MockMyService extends Mock implements MyService {};class FakeMyEvent extends Fake implements MyEvent {}。与 Mockito 不同,Mocktail 在运行时使用 noSuchMethod,无需代码生成。
注册 fallback 值:对配合 any()、captureAny()、captureThat() 使用的非空自定义类型,需注册 fallback 值,通常在 setUpAll 或测试顶部执行 setUpAll(() { registerFallbackValue(FakeMyEvent()); });。
桩方法:when(() => mock.fetchData()).thenReturn('result');抛错用 thenThrow(Exception('error'));动态或异步响应用 thenAnswer(() async => 'result');Future<void> 用 thenAnswer(() async {})。返回 Future 或 Future<void> 的异步方法一定用 thenAnswer;预期会被调用的每个方法都应桩,即使不是测试重点。
命名参数:when 与 verify 中都要包含全部命名参数,不关心的用 any(named: 'paramName');即使方法对命名参数有默认值,Mocktail 仍要求全部匹配。
验证:verify(() => mock.fetchData()) 表示至少调用一次;verifyNever(...) 表示从未调用;verify(...).called(2) 表示恰好两次。参数匹配器:位置参数不关心具体值时用 any();captureAny() 可捕获参数供后续断言(如 verify(() => mock.process(captureAny())).captured);captureThat() 做条件捕获。匹配字符串输出时注意该类型 .toString() 的返回内容。
限制:以上为资料提供的用法范围;关于安装命令、版本要求、平台支持等未提供。