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

使用Mockito Mock含链式接口方法的Java类时遇空指针问题求助

解决Mockito链式调用空指针异常的问题

我之前也踩过这个坑!你现在遇到的问题很典型:当你用Mockito.mock(MyProcess.class)创建mock对象时,Mockito默认会让这个mock的所有方法返回null。所以当你调用mock.getProcess()时,返回的是null,再接着调用.getService()自然就抛出空指针异常了。

下面给你两种实用的解决办法,根据你的链式层级复杂度选就行:

方法一:手动逐层Mock并绑定返回关系

这种方式适合层级不多的场景,逻辑清晰,容易调试:

// 先把链式调用里每一层的对象都Mock出来
MyProcess mock = Mockito.mock(MyProcess.class);
// 这里替换成getProcess()实际返回的类型
ProcessLayer mockProcessLayer = Mockito.mock(ProcessLayer.class);
// 替换成getService()实际返回的类型
Service mockService = Mockito.mock(Service.class);

// 绑定链式调用的返回逻辑
Mockito.when(mock.getProcess()).thenReturn(mockProcessLayer);
Mockito.when(mockProcessLayer.getService()).thenReturn(mockService);

// 现在再执行链式调用就不会NPE了
mock.getProcess()
    .getService()
    .startProcessInstanceByKey("String argument");

方法二:用Mockito的深度Mock特性(RETURNS_DEEP_STUBS)

如果你的链式调用层级比较多,手动Mock每一层太繁琐,可以用Mockito的深度Mock特性,一次性搞定多层链式调用的Mock:

// 创建支持深度Mock的对象,指定RETURNS_DEEP_STUBS参数
MyProcess mock = Mockito.mock(MyProcess.class, Mockito.RETURNS_DEEP_STUBS);

// 直接给最底层的方法设置返回值(中间层会自动被Mock)
Mockito.when(mock.getProcess().getService().startProcessInstanceByKey(Mockito.anyString()))
    .thenReturn(/* 这里填你需要返回的实例,比如ProcessInstance对象 */);

// 链式调用正常执行
mock.getProcess()
    .getService()
    .startProcessInstanceByKey("String argument");

⚠️ 注意:用深度Mock时,when()里的链式调用必须写完整,不能拆分步骤,否则可能会出现不符合预期的Mock行为。

如果之后需要验证链式调用中的方法是否被执行,也要对应写完整的调用链,比如:

Mockito.verify(mock.getProcess().getService()).startProcessInstanceByKey("String argument");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:34:00