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

如何Mock RestTemplate的exchange方法解决单元测试JsonNode空指针异常

问题根因
    1. RestTemplate mock响应非法:测试类中你构造的ResponseEntity响应体是格式错误的JSON字符串"{\\r\\"error\\":null\\r}",既没有data字段,error字段值为null,导致业务代码中responseJson.get("data")返回null触发error判断分支,调用responseJson.get("error").get("status")时,因为error本身是null直接抛出空指针。而且你已经定义了正确的接口返回字符串jsonString,但完全没有用到。
    1. Mock的JsonNode未生效:你在测试类中单独mock的JsonNode对象不会参与业务逻辑执行——AssignmentService是在方法内部自行new ObjectMapper().readTree(result)生成JsonNode实例,和你测试类定义的mock对象没有关联,相关mock规则全部无效。
    1. 业务代码存在URI拼接bug:AssignmentService中将uri定义为类成员变量,在类加载阶段就执行了"http://localhost:8080/api/users/"+uuid拼接,此时uuid还未赋值为方法入参,最终uri会拼接上null值,接口请求地址完全错误。
    1. 业务代码空指针防护缺失:代码中判断data为null后,没有先校验error字段是否为null、error.get("status")是否为null,直接调用asText()方法,只要任意一层字段不存在就会触发空指针。
修复方案

一、修复AssignmentService业务代码

  1. 修正URI拼接逻辑,将uri改为方法内部局部变量,用入参uuid拼接:
// 删掉类成员变量的uri定义,放到方法内部拼接
@Override
public List<String> assignApplicationsToUser(List<String> applications, String uuid)
        throws SQLException, RequestEntityNotFoundException {
    // 新增这行,用方法入参uuid拼接请求地址
    String uri="http://localhost:8080/api/users/"+uuid;
    // 其余原有代码不变
}
  1. 补全空指针校验逻辑,修改判断分支:
if (responseJson.get("data") == null) {
    JsonNode errorNode = responseJson.get("error");
    if (errorNode != null && errorNode.get("status") != null 
        && "NOT_FOUND".equals(errorNode.get("status").asText())) {
        throw new RequestEntityNotFoundException(uuid, "find");
    }
}

二、修复AssignmentServiceTest测试代码

  1. 构造正确的RestTemplate响应,用你已经定义好的jsonString作为响应体:
// 替换原来错误的myEntity构造逻辑
ResponseEntity<String> myEntity = new ResponseEntity<>(jsonString, HttpStatus.OK);
  1. 删除无效的JsonNode mock相关代码,因为业务代码用的是真实ObjectMapper解析返回的JSON,不需要mock JsonNode:
// 删除以下无效代码
// JsonNode mock;
//  setUp方法里的mock = org.mockito.Mockito.mock(JsonNode.class);
// 测试方法里的Mockito.when(mock.get("data")).thenReturn(mock);等相关mock逻辑
  1. 修正Repository mock规则匹配:你测试用的应用ID是app1、app2,之前的mock规则只匹配"1",所以不会触发返回,会走到新增逻辑,符合你的断言要求,如果要测试更新逻辑可以对应调整入参和mock规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 23:18:03