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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:31:14