如何使用Mockito验证函数无论传入任何参数都从未被调用
问题解答
你对verifyNever的判断不正确,它本身完全支持验证函数完全未被调用的场景,你遇到的报错是使用方法不当导致的。
问题原因分析
你当前的写法verifyNever(databaseService.searchPatient('sk'))的作用是验证**searchPatient方法从未以参数'sk'被调用**,如果你的需求是验证该方法不管传入什么参数都完全没有被调用,需要使用任意参数匹配器,而不是固定参数。
解决方案
根据不同的测试场景选择对应方案即可:
- 场景1:验证
databaseService的searchPatient方法完全没有被调用过(不限参数)
使用任意参数匹配器any()即可,强类型校验场景可以用any<String>()指定参数类型:verifyNever(databaseService.searchPatient(any())); - 场景2:验证
databaseService实例的所有方法都完全没有被调用过
直接使用Mockito内置的verifyZeroInteractions方法更简洁:verifyZeroInteractions(databaseService); - 场景3:确实需要验证
searchPatient从未以参数'sk'被调用
可以换用等效的called(0)写法实现相同效果:verify(databaseService.searchPatient('sk')).called(0);
额外排查点
如果修改后仍然报错,可以检查两项配置:
- 确认
getAndRegisterDatabaseService返回的是Mockito生成的Mock类实例,只有Mock对象的方法调用才会被Mockito捕获统计,真实实现类的调用不会被记录。 - 确认
await Future.delayed(Duration(seconds: 0))已经足够覆盖model.searchPatient内部的异步逻辑,如果内部有更长的延时,可以适当调大等待时间,或使用测试专用的FakeAsync控制时间流。
内容的提问来源于stack exchange,提问作者Hannes Hultergård
相关产品推荐
相关产品推荐

