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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:10:29