SpringBoot中RestTemplate调用后getBody()无返回值问题排查
问题原因&解决方案
核心问题定位
你遇到的执行中断是多个语法、匹配错误共同导致的,按优先级排序如下:
1. URL匹配失败导致Mockito返回空指针
你在HttpDataClient中使用String.format("/data/{0}", dataId)拼接路径,String.format的占位符是%前缀语法,{0}是MessageFormat的语法,这行代码实际生成的请求路径是/data/{0},和你测试Stub的/data/dataIdTest完全不匹配。
Mockito匹配不到对应Stub时会默认返回null,你调用null.getBody()触发空指针,但你的catch逻辑只捕获HttpStatusCodeException,空指针未被捕获直接导致程序中断。
2. 测试对象初始化错误
你需要测试的是HttpDataClient类,但测试类中错误初始化了HttpDataService对象,方法调用完全没有落到你要测试的业务逻辑上。
3. DataResponse类存在语法&逻辑错误
- 调用处使用
DataResponse.dataResponse()构造返回值,但类中实际定义的静态方法是gameDataResponse,方法名、返回类型都不匹配,编译阶段就存在问题。 failed()方法存在递归死循环:方法内部直接调用failed()自身,只要触发就会无限递归直到栈溢出,程序直接中断。
4. 缺失asString工具方法
HttpDataClient的dataResponse方法中调用了asString()方法,但你没有给出该方法的实现,运行时会报方法不存在错误。
修复步骤
- 修正URL拼接逻辑,二选一即可:
// 方案1:改用MessageFormat MessageFormat.format("/data/{0}", dataId) // 方案2:改用String.format标准占位符 String.format("/data/%s", dataId) - 修正测试类的测试对象:
// 替换原有HttpDataService初始化 private final HttpDataClient httpDataClient = new HttpDataClient(restTemplate); // 调用处替换为 DataResponse response = httpDataClient.getData("dataIdTest"); - 修复
DataResponse类的方法错误:// 修正静态构造方法名和返回类型 public static DataResponse dataResponse(String dataId, String author, String authorDataId, String serverSideDataId){ return new DataResponse(dataId, author, authorDataId, serverSideDataId); } // 修复failed方法死循环 public static DataResponse failed() { return new DataResponse("failed", "failed", "failed", "failed"); } - 补充
HttpDataClient中的asString方法:private String asString(JsonNode node, String fieldName) { JsonNode field = node.get(fieldName); return field != null ? field.asText() : null; } - 可选优化:测试中增加结果断言,验证返回值符合预期,同时开启Mockito严格 stubbing 模式,匹配失败时直接抛出明确错误,方便排查问题。
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

