为何@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
相关产品推荐
相关产品推荐

