Spring Boot集成测试报错:响应无法转为JSONObject求助
解决Spring Boot集成测试中JSON转换失败的问题
看你的报错信息,核心问题非常明确:接口返回的不是预期的JSON数据,而是HTML内容(从<!DOCTYPE这个开头就能判断)。这种情况大概率是请求地址有误,导致服务器返回了错误页面(比如404),而非正常的接口响应。下面一步步帮你排查解决:
1. 先确认实际返回的内容
先在测试代码里打印出响应体和状态码,明确服务器到底返回了什么:
@Test public void testRetrieveStudentCourse() throws JSONException { HttpEntity<String> entity = new HttpEntity<String>(null, headers); ResponseEntity<String> response = restTemplate.exchange( createURLWithPort("/student/getdetails/id"), HttpMethod.GET, entity, String.class); // 新增打印,排查实际响应 System.out.println("响应状态码: " + response.getStatusCode()); System.out.println("响应内容: " + response.getBody()); String expected = "{\"id\":1,\"rollno\":\"2\",\"Address\":\"Chicago\"}"; JSONObject json = new JSONObject(response.getBody()); JSONAssert.assertEquals(expected, json, false); }
如果打印出的是类似404的HTML页面,那就能坐实是请求地址的问题。
2. 检查请求URL是否正确
你的请求地址是/student/getdetails/id,看起来这里的id应该是路径参数占位符,而非固定字符串。比如你的Controller接口应该是类似@GetMapping("/student/getdetails/{id}")的定义,这时候测试请求需要替换成具体的ID值,比如:
// 把路径里的id替换成实际存在的学生ID,比如1 ResponseEntity<String> response = restTemplate.exchange( createURLWithPort("/student/getdetails/1"), HttpMethod.GET, entity, String.class);
3. 核对Controller的端点定义
确保你的Controller方法正确映射了带路径参数的接口,比如:
@GetMapping("/student/getdetails/{id}") public ResponseEntity<StudentDetails> getStudentDetails(@PathVariable Integer id) { // 业务逻辑 }
如果Controller里的映射路径和测试请求的路径不匹配,服务器就会返回404错误页面,自然无法解析成JSONObject。
4. 更优雅的测试方式(可选)
与其手动解析JSONObject,不如直接让RestTemplate返回实体类,代码更简洁也更易维护:
// 先定义对应的实体类 public class StudentDetails { private Integer id; private String rollno; private String Address; // 生成getter、setter、toString方法 } // 修改测试代码 @Test public void testRetrieveStudentCourse() { HttpEntity<String> entity = new HttpEntity<String>(null, headers); ResponseEntity<StudentDetails> response = restTemplate.exchange( createURLWithPort("/student/getdetails/1"), HttpMethod.GET, entity, StudentDetails.class); StudentDetails actual = response.getBody(); // 直接断言字段值 Assert.assertEquals(1, actual.getId()); Assert.assertEquals("2", actual.getRollno()); Assert.assertEquals("Chicago", actual.getAddress()); }
内容的提问来源于stack exchange,提问作者IrMan
相关产品推荐
相关产品推荐

