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

Mockito lenient() when方法不生效问题求助

Mockito Mock方法未返回指定值的排查方案
  • 未初始化Mock对象
    测试类必须启用Mockito注解支持:

    • JUnit 4:在类上添加@RunWith(MockitoJUnitRunner.class)
    • JUnit 5:在类上添加@ExtendWith(MockitoExtension.class)
      或者在测试方法/setup方法中手动执行MockitoAnnotations.openMocks(this),否则@Mock标注的对象只是null,不会生成真正的Mock实例。
  • 参数匹配使用错误

    • 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:55:30