使用Mockito的any匹配DateTime参数时出现空类型赋值报错如何解决
问题原因
Mockito升级至支持空安全的版本后,默认无参any返回Null值,无法赋值给非空类型的DateTime参数,因此触发argument_type_not_assignable报错,这是Mockito空安全适配后的强制规范要求。
解决步骤
- 启用Mockito代码生成:删除你手动编写的
MockTestClass类,放开代码中注释的@GenerateMocks注解,指定需要生成Mock的类@GenerateMocks([TestClass]) - 执行生成命令:在项目根目录执行
flutter pub run build_runner build,生成对应的Mock类文件,将生成的文件引入测试代码 - 修正打桩逻辑:将无参
any替换为带泛型的any<DateTime>(),同时保证thenAnswer返回值和原方法的Future<int>类型匹配
修正后完整代码示例
import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; // 替换为实际生成的mock文件路径,规则为 原测试文件名.mocks.dart import 'test_demo.mocks.dart'; abstract class TestClass { Future<int> testMethod(DateTime dateTime); } class InvokeClass { final TestClass testClass; InvokeClass(this.testClass); } @GenerateMocks([TestClass]) void main() { late MockTestClass testClass; late InvokeClass invokeClass; setUp(() { testClass = MockTestClass(); invokeClass = InvokeClass(testClass); }); test('打桩验证', () async { when(testClass.testMethod(any<DateTime>())).thenAnswer((_) async => 1); // 调用验证 expect(await testClass.testMethod(DateTime.now()), 1); }); }
注意事项
- 空安全版本的Mockito不推荐手动编写继承
Mock的Mock类,手动实现的类无法支持非空类型的参数匹配逻辑 - 所有非空类型的参数打桩时都需要指定
any的泛型,比如int类型参数用any<int>(),String类型参数用any<String>() - 打桩时返回值必须和原方法定义的返回类型完全匹配,返回
Future的方法需要在thenAnswer中加async或者直接返回Future对象
内容的提问来源于stack exchange,提问作者David B
相关产品推荐
相关产品推荐

