如何Mock a.getTypeA().getTypeB()?已Mock AClass但getTypeB调用真实方法
解决Mock链式调用中getTypeB()的问题
你现在的问题是只Mock了AClass,但getTypeA()返回的是真实的TypeA实例,所以调用getTypeB()时会走真实方法。要解决这个问题,需要把链式调用里的每个对象都Mock到位,或者用Mockito的深Mock特性。
方法一:显式Mock每个层级对象(推荐)
这种方式逻辑清晰,便于后续维护和调试:
- Mock TypeB并指定
getTypeB()的行为
// Mock TypeB对象 TypeB mockTypeB = Mockito.mock(TypeB.class); // 如果getTypeB有返回值,设置你期望的返回结果 Mockito.when(mockTypeB.getTypeB()).thenReturn(/* 自定义返回值 */);
- Mock TypeA,让它返回上面Mock好的TypeB
TypeA mockTypeA = Mockito.mock(TypeA.class); Mockito.when(mockTypeA.getTypeB()).thenReturn(mockTypeB);
- Mock AClass,让它返回Mock好的TypeA
AClass mockA = Mockito.mock(AClass.class); Mockito.when(mockA.getTypeA()).thenReturn(mockTypeA);
这样调用mockA.getTypeA().getTypeB()时,就会执行Mock后的逻辑,不会触发真实方法。
方法二:使用Mockito深Mock(简洁但不推荐复杂场景)
如果只是简单场景,可以用RETURNS_DEEP_STUBS选项直接Mock整个链式调用:
// 创建支持深Mock的AClass实例 AClass mockA = Mockito.mock(AClass.class, Mockito.RETURNS_DEEP_STUBS); // 直接指定链式调用的返回 Mockito.when(mockA.getTypeA().getTypeB()).thenReturn(/* 自定义返回值 */);
注意:深Mock虽然写法简洁,但在复杂的测试场景中,会降低代码可读性,也不利于排查Mock行为的问题,所以优先推荐第一种显式Mock的方式。
内容的提问来源于stack exchange,提问作者Samadhan Ghagare
相关产品推荐
相关产品推荐

