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

Spring Boot集成RestAssured后JSON数组元素字段校验失败问题求助

问题原因

  • Matcher使用错误:hasItem()/hasItems()属于集合匹配器,仅适用于数组/集合类型的返回值。你取$.[0].id这类单索引字段时,返回的是单个值,用集合匹配器必然匹配失败。
  • 字段数据类型不匹配:返回结果中第一个对象的size是数值类型3000,你断言时传入字符串"3000",类型不一致匹配失败。
  • 笔误问题:最后soldDate的断言中你写的是"2020-03-10",但实际返回的第一个对象soldDate是"2021-03-10",值不匹配导致失败。

解决方案

修正规则

  1. 单个字段校验用equalTo()或者is()匹配器,需提前导入org.hamcrest.Matchers.*
  2. 校验全量字段是否包含指定值时,直接用字段名即可提取所有同名字段的集合,用hasItems()匹配即可,注意数据类型要和返回值完全一致
  3. 修正笔误的日期值

修正后代码

@Test
final void restAssuredTestGetAllCars() {
    get("myapp/cars")
        .then().statusCode(200)
        .and()
            .body("$", hasSize(2))
            // 第一个对象单字段校验
            .body("$[0].id", equalTo(22))
            .body("$[0].type", equalTo("House"))
            .body("$[0].size", equalTo(3000)) // 对应数值类型,不加引号
            .body("$[0].soldDate", equalTo("2021-03-10"))
            // 第二个对象单字段校验
            .body("$[1].id", equalTo(27))
            .body("$[1].type", equalTo("Appartment"))
            .body("$[1].size", equalTo("750")) // 对应字符串类型,加引号
            .body("$[1].soldDate", equalTo("2020-01-22"))
            // 全量字段校验
            .body("id", hasItems(22, 27))
            .body("type", hasItems("House", "Appartment"))
            .body("size", hasItems(3000, "750")) // 同时匹配数值和字符串类型
            .body("soldDate", hasItems("2021-03-10", "2020-01-22"));
}

优化建议

如果业务允许,建议统一接口返回字段的类型,比如把size字段统一调整为数值类型,避免测试时需要多类型匹配的额外处理。

内容的提问来源于stack exchange,提问作者pixel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:15:03