如何Mock RestTemplate的exchange方法解决单元测试JsonNode空指针异常
问题根因
- RestTemplate mock响应非法:测试类中你构造的
ResponseEntity响应体是格式错误的JSON字符串"{\\r\\"error\\":null\\r}",既没有data字段,error字段值为null,导致业务代码中responseJson.get("data")返回null触发error判断分支,调用responseJson.get("error").get("status")时,因为error本身是null直接抛出空指针。而且你已经定义了正确的接口返回字符串jsonString,但完全没有用到。
- RestTemplate mock响应非法:测试类中你构造的
- Mock的JsonNode未生效:你在测试类中单独mock的
JsonNode对象不会参与业务逻辑执行——AssignmentService是在方法内部自行new ObjectMapper().readTree(result)生成JsonNode实例,和你测试类定义的mock对象没有关联,相关mock规则全部无效。
- Mock的JsonNode未生效:你在测试类中单独mock的
- 业务代码存在URI拼接bug:AssignmentService中将
uri定义为类成员变量,在类加载阶段就执行了"http://localhost:8080/api/users/"+uuid拼接,此时uuid还未赋值为方法入参,最终uri会拼接上null值,接口请求地址完全错误。
- 业务代码存在URI拼接bug:AssignmentService中将
- 业务代码空指针防护缺失:代码中判断
data为null后,没有先校验error字段是否为null、error.get("status")是否为null,直接调用asText()方法,只要任意一层字段不存在就会触发空指针。
- 业务代码空指针防护缺失:代码中判断
修复方案
一、修复AssignmentService业务代码
- 修正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; // 其余原有代码不变 }
- 补全空指针校验逻辑,修改判断分支:
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测试代码
- 构造正确的RestTemplate响应,用你已经定义好的
jsonString作为响应体:
// 替换原来错误的myEntity构造逻辑 ResponseEntity<String> myEntity = new ResponseEntity<>(jsonString, HttpStatus.OK);
- 删除无效的JsonNode mock相关代码,因为业务代码用的是真实ObjectMapper解析返回的JSON,不需要mock JsonNode:
// 删除以下无效代码 // JsonNode mock; // setUp方法里的mock = org.mockito.Mockito.mock(JsonNode.class); // 测试方法里的Mockito.when(mock.get("data")).thenReturn(mock);等相关mock逻辑
- 修正Repository mock规则匹配:你测试用的应用ID是
app1、app2,之前的mock规则只匹配"1",所以不会触发返回,会走到新增逻辑,符合你的断言要求,如果要测试更新逻辑可以对应调整入参和mock规则。
内容的提问来源于stack exchange,提问作者Abhishek Jaiswal
相关产品推荐
相关产品推荐

