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

Mockito单元测试中私有方法内依赖方法Mock不生效怎么办

问题根因

你在测试代码中定义的Mock规则和实际业务代码调用的方法不匹配,这是Mock不生效的核心原因:

  • 测试代码里你Stub的是publicMethod1(Classx)带参重载方法,要求调用时必须传入你预先Mock的mockClassObj对象才会返回1000
  • 但实际ClassToTest的私有方法里调用的是无参的publicMethod1(),二者属于完全不同的方法签名,Mockito无法匹配到你预设的Stub规则,无参方法没有被Mock的情况下会执行原生逻辑,自然会出现返回值不符合预期甚至NPE的问题。

解决方法

1. 修正Stub的方法签名(适配你当前场景的最优方案)

直接删除测试代码中无用的Classx mock对象,改为Stub无参版本的publicMethod1即可:

@Test
public void test() {
    // 删掉多余的Classx mock代码
    when(classToInject.publicMethod1()).thenReturn(1000);
    classToTest.publicMethod();
}

2. 重载场景下的参数匹配处理

如果你实际业务调用的是带Classx参数的重载方法,只是贴出的代码示例有省略,那么可以用Mockito参数匹配器来兼容任意入参的场景:

@Test
public void test() {
    // any(Classx.class)会匹配所有Classx类型的入参
    when(classToInject.publicMethod1(any(Classx.class))).thenReturn(1000);
    classToTest.publicMethod();
}

3. 额外校验项

  • 优先给测试类添加@RunWith(MockitoJUnitRunner.class)注解,不需要手动写initMocks逻辑,避免初始化出错
  • 不需要给@InjectMocks修饰的被测类额外加@Spy注解,多余的注解会导致依赖注入逻辑异常,反而影响Mock效果

内容的提问来源于stack exchange,提问作者Sonali Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:05