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

