Mockito lenient() when方法不生效问题求助
Mockito Mock方法未返回指定值的排查方案
未初始化Mock对象
测试类必须启用Mockito注解支持:- JUnit 4:在类上添加
@RunWith(MockitoJUnitRunner.class) - JUnit 5:在类上添加
@ExtendWith(MockitoExtension.class)
或者在测试方法/setup方法中手动执行MockitoAnnotations.openMocks(this),否则@Mock标注的对象只是null,不会生成真正的Mock实例。
- JUnit 4:在类上添加
参数匹配使用错误
- 调用
abc方法时,不能混合使用具体参数值和Mockito匹配器(比如any())。要么所有参数都用匹配器,要么都用具体值。 - 确认传入的第三个参数确实是
Map类型(或其子类),any(Map.class)可以匹配所有Map实现类,但如果传入的不是Map类型,存根不会触发。
- 调用
Mock对象未正确注入被测类
如果被测类中是自己new的Random实例,而非依赖注入的mockRandom,那么Mock存根不会生效。需要用@InjectMocks注解让Mockito自动将Mock对象注入到被测类的对应依赖中,或者手动设置被测类的Random字段为mockRandom。验证存根是否正确触发
可以添加验证语句,确认abc方法是否被调用:Mockito.verify(mockRandom).abc(any(String.class), any(String.class), any(Map.class));如果验证失败,说明被测代码根本没调用这个Mock对象的
abc方法,需要检查被测逻辑。
示例正确测试类结构:
@ExtendWith(MockitoExtension.class) class RandomTest { @Mock private Random mockRandom; @InjectMocks private DependentClass dependentClass; // 依赖Random的被测类 @Test void testAbcReturn() { // 配置存根 Mockito.when(mockRandom.abc(any(String.class), any(String.class), any(Map.class))) .thenReturn("Test value"); // 执行被测逻辑 String result = dependentClass.callRandomAbc(); // 断言结果 assertEquals("Test value", result); // 验证方法调用 Mockito.verify(mockRandom).abc(any(String.class), any(String.class), any(Map.class)); } }
内容的提问来源于stack exchange,提问作者Rohan verma
相关产品推荐
相关产品推荐

