Spring MVC Test中AssertJ转Hamcrest:如何测试带日期的POJO集合项
用Hamcrest实现AssertJ集合Tuple断言的等价写法
嘿,刚好我对Spring MVC Test里的Hamcrest断言很熟悉,这就帮你把AssertJ的那个集合断言转换成等价的Hamcrest写法!
首先,先明确AssertJ的.containsExactly(tuple(...), tuple(...))做了什么:它会严格校验集合的元素顺序、数量,以及每个元组里的每一个值都完全匹配。在Hamcrest里,我们可以通过组合两个核心匹配器来实现完全一样的效果:
1. 基础场景(集合元素是Object数组/元组)
假设你的集合里的元素是和AssertJ tuple()生成的一样的Object数组,那对应的Hamcrest代码是这样的:
首先别忘了静态导入Hamcrest的匹配器(这步很重要,不然代码会很臃肿):
import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.containsExactly; import static org.hamcrest.Matchers.equalTo;
然后写断言:
// 假设yourCollection是你要断言的目标集合 assertThat(yourCollection, containsExactly( // 第一个元组的匹配规则:数组里的每个元素依次匹配 arrayContaining( equalTo("087"), equalTo("Peter"), equalTo("Jordani"), equalTo(parse("1980-01-01")) // 这里的parse和你AssertJ里的一致,确保类型匹配 ), // 第二个元组的匹配规则 arrayContaining( equalTo("088"), equalTo("Isaias"), equalTo("Jordano"), equalTo(parse("1980-01-01")) ) ));
2. Spring MVC Test的JSON响应场景
如果是在Spring MVC Test里断言接口返回的JSON数组,那写法会稍有不同——因为JSON里的日期通常是字符串形式,不用手动parse,直接匹配字符串即可:
mockMvc.perform(get("/api/your-resource")) .andExpect(status().isOk()) .andExpect(jsonPath("$", containsExactly( arrayContaining( equalTo("087"), equalTo("Peter"), equalTo("Jordani"), equalTo("1980-01-01") ), arrayContaining( equalTo("088"), equalTo("Isaias"), equalTo("Jordano"), equalTo("1980-01-01") ) )));
关键匹配器说明
containsExactly: 和AssertJ的同名方法完全等价,强制要求元素顺序、数量、内容完全一致,多一个少一个或者顺序不对都会断言失败arrayContaining: 用来匹配数组/元组里的每一个元素,确保每个位置的值都和预期一致equalTo: 用来做值的精确匹配,支持各种基本类型、日期类型(只要重写了equals方法)
如果你的元组是自定义的Java类(不是Object数组),那可以用Hamcrest的samePropertyValuesAs匹配器来匹配对象的属性值,或者自己写一个自定义匹配器,不过大部分场景下用上面的写法就足够啦。
内容的提问来源于stack exchange,提问作者Manuel Jordan
相关产品推荐
相关产品推荐

