Hamcrest的Matchers.containsInAnyOrder断言不生效如何修复?
问题原因
你遇到的断言失败不是依赖配置问题,而是containsInAnyOrder方法的使用方式错误:
Hamcrest 1.3中Matchers.containsInAnyOrder的入参是单个元素的可变参数序列,而不是直接传入期望的集合对象。你直接把output1这个List作为参数传入时,方法会把整个List当成单个元素去匹配待校验集合的元素,自然会断言失败。
修复方案
方案1:将期望集合转为数组传入
直接调用List的toArray()方法把期望集合转为数组,匹配可变参数的方法签名即可,该方案会严格校验两个集合的元素完全一致(元素数量相同、没有多余/缺失元素),仅忽略顺序,完全符合你的需求:
Assert.assertThat(output, Matchers.containsInAnyOrder(output1.toArray()));
方案2:组合Matcher实现相同效果(可选)
如果需要更灵活的校验逻辑,可以组合多个Matcher实现同等效果:
// 先校验待校验集合包含期望集合的所有元素,再校验元素数量完全匹配 Assert.assertThat(output, both(Matchers.hasItems(output1.toArray())).and(Matchers.hasSize(output1.size())));
额外校验项
如果修改写法后仍然报错,可以检查以下两项:
- 确认导包正确,导入的是
org.hamcrest.Matchers,而非JUnit自带的旧版本Hamcrest类 - 运行
mvn dependency:tree检查测试依赖中是否还有其他未排除的Hamcrest子包依赖,避免版本冲突
内容的提问来源于stack exchange,提问作者Johnyb
相关产品推荐
相关产品推荐

