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

