Spring Boot如何正确测试Controller的响应结果?
正确测试Controller响应结果的方法
首先明确问题根源:你编写的预期JSON字符串不符合标准JSON规范(键和字符串值未加双引号),而接口实际返回的是符合规范的JSON结构,直接用assertEquals做字符串全等比对必然失败。以下是几种可靠的解决方案:
方案1:构造标准JSON字符串进行比对
把预期字符串调整为符合JSON规范的格式,注意转义双引号:
// 符合JSON规范的预期字符串,键和值均带双引号 String expectedResponse = "{\"price\":\"type correct price\"}"; // 后续断言代码保持不变 assertEquals(400, result.getStatusCodeValue()); assertEquals(expectedResponse, result.getBody());
注意:该方法仅适用于返回内容固定、字段顺序不会变更的场景,若接口返回字段顺序调整,断言会直接失败。
方案2:用Jackson解析成Map后比对
借助Jackson的ObjectMapper将JSON字符串转为Map,通过比对Map内容而非字符串格式来验证结果,不受字段顺序影响:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; // ... 其他测试代码 ObjectMapper objectMapper = new ObjectMapper(); // 将预期JSON转为Map Map<String, String> expectedMap = objectMapper.readValue("{\"price\":\"type correct price\"}", Map.class); // 将实际响应体转为Map Map<String, String> actualMap = objectMapper.readValue(result.getBody(), Map.class); // 比对两个Map的内容 assertEquals(expectedMap, actualMap);
方案3:用JSONAssert做灵活断言
JSONAssert是专门用于JSON断言的工具库,支持忽略字段顺序、仅校验指定字段等灵活操作,适配大多数接口测试场景:
第一步:添加Maven依赖
<dependency> <groupId>org.skyscreamer</groupId> <artifactId>jsonassert</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency>
第二步:编写断言代码
import org.skyscreamer.jsonassert.JSONAssert; // ... 其他测试代码 String expectedJson = "{\"price\":\"type correct price\"}"; // 第三个参数设为false,表示忽略字段顺序 JSONAssert.assertEquals(expectedJson, result.getBody(), false);
方案4:映射到自定义错误响应类
如果你的Controller返回统一格式的错误响应,可以定义对应的Java类,直接用restTemplate接收该类型,通过比对对象属性完成验证:
第一步:定义错误响应类
public class ErrorResponse { private String price; // 生成getter和setter方法 public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } }
第二步:修改测试代码
// 将响应类型从String改为自定义的ErrorResponse ResponseEntity<ErrorResponse> result = this.restTemplate.postForEntity(uri, request, ErrorResponse.class); assertEquals(400, result.getStatusCodeValue()); // 直接比对具体属性值 assertEquals("type correct price", result.getBody().getPrice());
内容的提问来源于stack exchange,提问作者asdasdas
相关产品推荐
相关产品推荐

