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

使用Mockito验证带参函数调用时出现参数匹配报错如何解决?

问题原因
  • id参数值不匹配:实际调用时id传入的是'uid'(你配置的authService.currentUser的uid值),但verify时写的是id: 'some string',参数值不一致导致匹配失败
  • 第二个参数匹配失败:verify时你传入的business变量在测试代码中未定义,也和实际调用时内部生成的Business实例不是同一个对象,Mockito默认按实例相等校验,因此匹配失败
  • 异步逻辑未等待执行:如果createBusiness是异步方法(内部调用了返回Future的addModelToCollection),你没有加await就直接执行verify,此时方法内部逻辑还没执行到调用addModelToCollection的步骤,自然捕获不到调用
  • Stub规则不严谨:你在配置when stub规则时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:18:01