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

为何@Mock与doReturn().when()对两个对象表现不同?

问题排查与解决

针对你遇到的ClassB mock方法返回null的问题,以下是几个常见的排查方向和解决办法:

1. 确保Mockito注解生效

测试类需要添加Mockito的运行器或扩展注解,否则@Mock和@InjectMocks不会被正确初始化。虽然ClassA正常工作,但可能是偶然情况,建议补上:

JUnit 4 版本

@RunWith(MockitoJUnitRunner.class)
public class TestClassC {
    // 现有代码
}

JUnit 5 版本

@ExtendWith(MockitoExtension.class)
public class TestClassC {
    // 现有代码
}

2. 检查方法参数匹配度

Mockito的mock规则是参数完全匹配才会返回预设值,如果ClassC.method()中调用classB.getEvent()时传入的参数和测试中doReturn().when()里的参数不完全一致(比如存在空格、特殊字符,或者实际参数不是空字符串),就会返回默认的null。

解决办法是使用Mockito的参数匹配器,兼容任意字符串参数:

import static org.mockito.ArgumentMatchers.anyString;

// 修改测试中的mock语句
doReturn(event).when(classB).getEvent(anyString(), anyString());

3. 验证ClassB的方法签名与重载

确认ClassB中的getEvent方法签名和你mock的完全一致:

  • 方法名拼写是否正确(比如是否写成getEvents)
  • 参数个数、类型是否匹配(比如是否都是String类型)
  • 是否存在重载方法:如果ClassB有多个getEvent方法,要确保你mock的是ClassC实际调用的那个版本。

4. 验证mock方法是否被调用

在测试方法末尾添加验证,确认ClassB.getEvent()确实被调用了:

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;

// 测试方法末尾添加
verify(classB, times(1)).getEvent(anyString(), anyString());

如果验证失败,说明ClassC中的classB实例不是你mock的对象,此时可以尝试手动注入:

@Test
public void testMethod(){
    // 其他代码
    classC.classB = classB; // 手动注入mock对象
    classC.method();
}

内容的提问来源于stack exchange,提问作者Anish Mittal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:04:54