Mockito 5.4.0中When().ThenReturn()失效,始终返回false求助
问题分析与解决方案
核心问题
1. 方法重载不匹配(mock失效的关键原因)
业务代码中调用clientManger.isMonitored(String, Client.class, Boolean)时,传递的是三个Class类型对象(String等价于String.class,Client.class、Boolean等价于Boolean.class),对应方法签名为:
boolean isMonitored(Class<String>, Class<Client>, Class<Boolean>);
但测试代码里mock的是接受String实例、Client实例、Boolean实例的重载方法:
Mockito.when(qcm.isMonitored(Mockito.anyString(), Mockito.any(Client.class), Mockito.anyBoolean())).thenReturn(true);
两个方法签名完全不同,Mockito无法匹配到实际调用的方法,因此返回mock默认值false。
2. 代码笔误导致成员变量未初始化
FriendlyName构造函数中,参数qcm被错误赋值给了未定义的quasarClientManger,而类中实际成员变量是clientManger,这会导致clientManger未初始化(若运行未报NPE,大概率是代码书写笔误)。
3. 方法名拼写错误
业务类中定义的方法是handler(),但测试中调用的是handle(),这会导致编译错误或测试调用错误方法。
修复方案
1. 对齐方法调用与mock匹配器
- 如果业务代码调用是笔误,应传递实际的参数实例而非Class对象:
// 示例:传递payload、client实例、布尔值 if (clientManger.isMonitored(payload, client, true)) { // ... } - 如果业务代码调用是正确的(确实需要传递Class对象),则修正测试中的mock匹配器:
// 匹配任意Class类型参数 Mockito.when(qcm.isMonitored(Mockito.any(Class.class), Mockito.any(Class.class), Mockito.any(Class.class))) .thenReturn(true); // 或精确匹配目标Class Mockito.when(qcm.isMonitored(Mockito.eq(String.class), Mockito.eq(Client.class), Mockito.eq(Boolean.class))) .thenReturn(true);
2. 修正成员变量赋值
确保构造函数正确初始化clientManger:
public FriendlyName(Client client, ClientManager qcm) { this.clientManger = qcm; }
3. 修正方法名拼写
统一业务类与测试中的方法名:
// 业务类中修正方法名 public void handle(String payload) throws Exception { // ... }
完成以上修正后,Mockito的mock会正确匹配实际调用的方法,返回true,测试断言即可通过。
内容的提问来源于stack exchange,提问作者VS1928
相关产品推荐
相关产品推荐

