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

如何Mock a.getTypeA().getTypeB()?已Mock AClass但getTypeB调用真实方法

解决Mock链式调用中getTypeB()的问题

你现在的问题是只Mock了AClass,但getTypeA()返回的是真实的TypeA实例,所以调用getTypeB()时会走真实方法。要解决这个问题,需要把链式调用里的每个对象都Mock到位,或者用Mockito的深Mock特性。

方法一:显式Mock每个层级对象(推荐)

这种方式逻辑清晰,便于后续维护和调试:

  1. Mock TypeB并指定getTypeB()的行为
// Mock TypeB对象
TypeB mockTypeB = Mockito.mock(TypeB.class);
// 如果getTypeB有返回值,设置你期望的返回结果
Mockito.when(mockTypeB.getTypeB()).thenReturn(/* 自定义返回值 */);
  1. Mock TypeA,让它返回上面Mock好的TypeB
TypeA mockTypeA = Mockito.mock(TypeA.class);
Mockito.when(mockTypeA.getTypeB()).thenReturn(mockTypeB);
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:19:56