Kotlin RestAssured匹配自定义错误响应meta集合的正确写法
问题根因
RestAssured解析JSON响应时,默认会将JSON对象映射为LinkedHashMap类型,而非你自定义的ErrorDto类型。即使双方字段值完全一致,不同类型的实例匹配也会直接失败,这就是你报错的核心原因。
解决方案
方案1:直接匹配Map键值对(无需额外配置,最简便)
因为实际拿到的meta数组元素是Map结构,直接用Hamcrest的hasEntry匹配键值对即可:
body("meta", hasItem( allOf( hasEntry("code", "code"), hasEntry("description", "description") ) ));
如果你的meta数组固定只有1个元素,可以简化成:
body("meta[0]", allOf( hasEntry("code", "code"), hasEntry("description", "description") ));
方案2:映射为自定义DTO后匹配(适合有大量同类型校验的场景)
首先确保你的项目引入了RestAssured的Jackson适配依赖,且ErrorDto符合反序列化要求(有无参构造方法、字段有对应getter/setter,或使用Lombok @Data注解),写法如下:
// 先将meta字段反序列化为ErrorDto集合 List<ErrorDto> metaList = response.jsonPath().getList("meta", ErrorDto.class); // 再匹配集合元素 assertThat(metaList, hasItem(new ErrorDto("code", "description")));
注意:使用该方案需要确保ErrorDto已经重写了equals()和hashCode()方法。
方案3:按字段批量匹配
如果不需要校验同一个元素的属性关联,只是要确认集合中存在对应code和description,可以直接按JSON路径批量匹配:
body("meta.code", hasItem("code")); body("meta.description", hasItem("description"));
内容的提问来源于stack exchange,提问作者darth jemico
相关产品推荐
相关产品推荐

