Spring Boot集成RestAssured后JSON数组元素字段校验失败问题求助
问题原因
- Matcher使用错误:
hasItem()/hasItems()属于集合匹配器,仅适用于数组/集合类型的返回值。你取$.[0].id这类单索引字段时,返回的是单个值,用集合匹配器必然匹配失败。 - 字段数据类型不匹配:返回结果中第一个对象的
size是数值类型3000,你断言时传入字符串"3000",类型不一致匹配失败。 - 笔误问题:最后
soldDate的断言中你写的是"2020-03-10",但实际返回的第一个对象soldDate是"2021-03-10",值不匹配导致失败。
解决方案
修正规则
- 单个字段校验用
equalTo()或者is()匹配器,需提前导入org.hamcrest.Matchers.* - 校验全量字段是否包含指定值时,直接用
字段名即可提取所有同名字段的集合,用hasItems()匹配即可,注意数据类型要和返回值完全一致 - 修正笔误的日期值
修正后代码
@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
相关产品推荐
相关产品推荐

