Mockito中or匹配器在verify时失效问题排查
验证互斥logWarn调用的执行情况
场景
程序存在随机性,只会执行以下两个logWarn调用中的一个:
myLogger.logWarn("My 1st Warning Message"); myLogger.logWarn("My 2nd Warning Message");
错误尝试与问题
尝试用or匹配参数验证任意一个调用是否执行,代码如下:
verify(myLogger).logWarn(or("My 1st Warning Message", "My 2nd Log Warning Message"));
运行测试时触发Mockito异常:
No matchers found for additional matcher Or(?) -> at foobar.builder.StopBuilderTest.build(StopBuilderTest.java:141) org.mockito.exceptions.misusing.InvalidUseOfMatchersException: No matchers found for additional matcher Or(?) -> at foobar.builder.StopBuilderTest.build(StopBuilderTest.java:141)
单独验证单个参数时测试可正常通过:
verify(myLogger).logWarn("My 1st Warning Message");
正确解决方案
Mockito的or匹配器必须配合参数匹配器使用,不能直接传入字符串字面量。需用eq()包裹每个目标字符串,将其转换为匹配器后再传入or:
verify(myLogger).logWarn(or(eq("My 1st Warning Message"), eq("My 2nd Warning Message")));
也可以使用anyOf匹配器实现相同效果:
verify(myLogger).logWarn(anyOf(eq("My 1st Warning Message"), eq("My 2nd Warning Message")));
原因
Mockito规则:使用匹配器(如or)时,所有参数都必须是匹配器类型,不能混合字面量和匹配器。直接传字符串会导致Mockito无法识别or为合法匹配器,从而抛出异常。用eq()将字面量转为匹配器后,or就能正常工作,验证两个参数中任意一个被调用一次的场景。
内容的提问来源于stack exchange,提问作者Tymo
相关产品推荐
相关产品推荐

