SuperAPI AI 工具集

mockito

测试与质量

查看项目

更新于 10-16 05:07

技能介绍

用途:本技能定义在 Dart 与 Flutter 测试中如何正确使用 mockito 包进行模拟。

对象选择:优先使用真实对象;不需要交互验证时优先使用 fake(extends Fake,只覆写需要的方法);仅当需要验证交互(调用次数、参数)或打桩动态响应时才用 mock(extends Mock)。数据模型若能以桩数据构造就不应 mock。只有测试含 verify 断言时才用 mock。

生成 mock:使用 @GenerateMocks([MyClass]),或使用 @GenerateNiceMocks([MockSpec<MyClass>()]) 生成 nice mock(缺失桩时返回简单合法值)。运行 dart run build_runner build。默认只对 test/ 下的文件标注生成;如需在 test/ 之外生成,使用 build.yaml。不要给 extends Mock 的类添加 @override 方法或实现,也不要在 mock 构造函数或 mock 类内部打桩,始终在测试中打桩。

打桩:when(mock.sound()).thenReturn('Meow');thenThrow(Exception('No sound'));thenAnswer((_) => computedValue);thenReturnInOrder(['Meow', 'Purr'])。需要特定返回值时先打桩再使用。缺失桩行为:@GenerateMocks 抛异常,@GenerateNiceMocks 返回简单合法值;可用 throwOnMissingStub(mock) 让未打桩调用抛异常。

验证:verify(mock.sound()) 至少一次;verifyNever(mock.eat(any)) 从未调用;verify(mock.sound()).called(2) 恰好两次;异步用 await untilCalled(mock.sound())。

参数匹配器:when(mock.eat(any)).thenReturn(true);when(mock.eat(argThat(isNotNull))).thenReturn(true);命名参数 when(mock.fetch(any, headers: any)).thenReturn(response)。不要在参数匹配器旁使用 null;命名参数中 any 或 argThat 用作值而非参数名。

捕获参数:final captured = verify(mock.eat(captureAny)).captured;captured.last 为最后捕获的参数;条件捕获用 captureThat。

重置:reset(mock) 清除所有桩与交互;clearInteractions(mock) 只清除记录的交互。

模拟函数类型:为回调等函数类型定义含所需签名的抽象类并生成 mock,例如 abstract class Callback { void call(String value); } 配合 @GenerateMocks([Callback])。

调试:logInvocations([mock1, mock2]) 打印所有收集到的调用。

限制:资料未提供更多平台、收费或版本信息。