重写equals/hashCode后,containsInAnyOrder比较CustomField列表为何失败?
问题原因与解决方案
核心问题
你调用containsInAnyOrder(expected)时,Hamcrest会把整个expected列表当作单个元素去检查actual列表是否包含这个列表对象,而不是验证actual的元素和expected的元素是否一一匹配(不考虑顺序),这和你的预期不符,所以断言失败。
正确写法
你需要把expected的元素作为可变参数传给containsInAnyOrder,或者将列表转为数组传入,以下几种方式都可行:
方式1:直接传入单个元素(适合元素数量少的场景)
assertThat(actual, containsInAnyOrder( new CustomField(1L, "1L"), new CustomField(2L, "2L"), new CustomField(3L, "3L") ));
方式2:将列表转为数组传入
assertThat(actual, containsInAnyOrder(expected.toArray(new CustomField[0])));
Java 8及以上可以用更简洁的写法:
assertThat(actual, containsInAnyOrder(expected.stream().toArray(CustomField[]::new)));
方式3:配合元素匹配器使用
如果需要更灵活的匹配逻辑,也可以给每个元素指定匹配器:
assertThat(actual, containsInAnyOrder( equalTo(new CustomField(1L, "1L")), equalTo(new CustomField(2L, "2L")), equalTo(new CustomField(3L, "3L")) ));
补充说明
你的CustomField类重写的equals和hashCode方法是正确的,只要两个对象的id和name完全相等,就会被判定为相等,这部分没有问题。
内容的提问来源于stack exchange,提问作者S.Dan
相关产品推荐
相关产品推荐

