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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:33