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

Java中使用Mockito验证Json.parse未被调用的报错问题求解

错误原因梳理

第一个NPE错误原因

你写的when(Json.parse(wsResponse.getBody())).thenThrow(...)用法不符合Mockito规则:when仅作用于Mock对象的方法,你直接调用了真实的Json.parse方法,会直接执行真实逻辑,如果wsResponse.getBody()为空或者parse方法入参不符合要求,就会直接抛出空指针,不会进入stub逻辑。

第二个NotAMockException错误原因

verify方法第一个参数要求传入Mock对象本身,你传入了Json.parse(wsResponse.getBody())的返回值(ObjectNode类型),这个对象不是Mock生成的,所以抛出非Mock对象的异常。而且如果Json.parse是静态方法,普通的实例Mock规则也不适用。

正确实现方案

前提说明

如果Json.parse是工具类的静态方法,需要使用Mockito 3.4及以上版本提供的静态方法Mock能力;如果是实例方法,直接Mock对应的Json实例即可。

静态方法验证代码示例

import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.never;
import static org.mockito.ArgumentMatchers.any;

// 测试方法内部逻辑
try (var mockedJsonStatic = mockStatic(Json.class)) {
    // 准备依赖的wsResponse模拟数据
    when(wsResponse.getBody()).thenReturn("你的测试返回报文");

    // 执行待测试的业务方法
    yourTargetService.yourTestMethod(wsResponse);

    // 验证Json.parse方法从未被调用,入参匹配规则可根据实际需求调整
    mockedJsonStatic.verify(
        () -> Json.parse(any(String.class)),
        never()
    );
}

实例方法验证代码示例

如果Json.parse是实例方法,将Json实例作为依赖注入到业务类中,测试时传入Mock实例即可:

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.ArgumentMatchers.any;

// 测试类中先Mock Json实例
Json mockJson = mock(Json.class);
// 将mockJson注入到待测试的业务类实例中
YourService yourService = new YourService(mockJson);

// 测试逻辑
when(wsResponse.getBody()).thenReturn("你的测试返回报文");
yourService.yourTestMethod(wsResponse);
// 验证方法未调用
verify(mockJson, never()).parse(any(String.class));

低版本Mockito适配

如果你使用的Mockito版本低于3.4不支持静态方法Mock,可以选择:

  • 引入PowerMock组件实现静态方法Mock
  • 重构代码,将Json序列化逻辑封装为可注入的实例依赖,降低代码耦合度方便测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:03