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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:55:01