Mockito如何无需equals方法验证调用并检查send方法调用次数?
解决Mockito中无需初始化参数即可验证方法调用次数的问题
嘿,我完全懂你的痛点——Spock的参数匹配确实省心不少,但Mockito也有办法帮你绕开繁琐的对象初始化,只专注于验证方法的调用次数,不用管参数对象是否相等。下面给你几个实用的方案:
1. 使用any()匹配器忽略参数校验
这是最直接的方式,Mockito的any()系列匹配器会跳过参数的equals校验,只要方法被调用时传入的是对应类型的对象(哪怕是未完全初始化、带null属性的),都会被匹配到。
比如你的send方法参数是SimpleMailMessage,验证它被调用X次的代码可以这么写:
// 假设mailSender是你Mock出来的发送器实例 verify(mailSender, times(X)).send(any(SimpleMailMessage.class));
如果不想指定具体类型,也可以用无参的any(),不过指定类型会让测试更严谨,避免匹配到其他重载方法。
2. 针对多个发送者分别验证
你提到有mailSender等2个发送者,只要对每个Mock对象单独做verify即可,互不影响:
// 验证第一个发送器的send方法被调用2次 verify(mailSender, times(2)).send(any(SimpleMailMessage.class)); // 验证第二个发送器的send方法被调用1次 verify(anotherMailSender, times(1)).send(any());
为什么之前会报错?
Mockito默认是严格参数匹配:如果不用匹配器,它会调用参数对象的equals()方法来对比传入的实例和你测试里写的实例是否相等。而未初始化的SimpleMailMessage可能在执行equals()时访问了null属性,导致抛出空指针异常。用any()匹配器就完全跳过了这个equals校验,自然不会报错。
如果之后遇到更复杂的场景(比如只想验证参数的某个属性),还可以用argThat()自定义匹配器,但对你当前的需求来说,any()已经足够解决问题啦。
内容的提问来源于stack exchange,提问作者minizibi
相关产品推荐
相关产品推荐

