使用Mockito验证带参函数调用时出现参数匹配报错如何解决?
问题原因
- id参数值不匹配:实际调用时
id传入的是'uid'(你配置的authService.currentUser的uid值),但verify时写的是id: 'some string',参数值不一致导致匹配失败 - 第二个参数匹配失败:verify时你传入的
business变量在测试代码中未定义,也和实际调用时内部生成的Business实例不是同一个对象,Mockito默认按实例相等校验,因此匹配失败 - 异步逻辑未等待执行:如果
createBusiness是异步方法(内部调用了返回Future的addModelToCollection),你没有加await就直接执行verify,此时方法内部逻辑还没执行到调用addModelToCollection的步骤,自然捕获不到调用 - Stub规则不严谨:你在配置
whenstub规则时,addModelToCollection没有设置参数匹配规则,空安全版本的Mockito下这种写法无法匹配到实际带参数的调用,可能导致方法执行异常。
修复方案
修改后的测试代码如下:
test('fireStore service should be called', () async { // Arrange final authService = getAuthServiceMock(); final fireService = getFirestoreServiceMock(); const testUid = 'uid'; when(authService.currentUser).thenReturn(UserModel(uid: testUid)); // Stub时用any匹配任意位置参数,anyNamed匹配命名参数 when(fireService.addModelToCollection(any, any, id: anyNamed('id'))) .thenAnswer((realInvocation) => Future.value('sdfff')); final model = RegistraionViewModel(); // 异步方法加await等待执行完成 await model.createBusiness({ 'title': "text", 'description': "text", }); // verify时用any匹配任意Business实例,id传入实际值 verify(fireService.addModelToCollection('businesses', any, id: testUid)).called(1); });
如果使用空安全版本的Mockito,提示any不符合参数类型要求,可替换为带类型的匹配规则,例如any<String>()、any<Business>()。
内容的提问来源于stack exchange,提问作者Ekama Emmanuel Uloho
相关产品推荐
相关产品推荐

