我们有一个带有几个字段的自定义类,由于业务领域的原因,我们不能覆盖它们的equals/hashcode方法

不过,在单元测试期间,我们应该断言集合中是否包含此类的项目

List<CustomClass> customObjectList = classUnderTest.methodUnderTest();
//create customObject with fields set to the very same values as one of the elements in customObjectList
//we should assert here that customObjectList contains customObject

但是,到目前为止,我们没有找到任何在不覆盖equals/hashcode的情况下可行的解决方案,例如哈姆克雷斯特
assertThat(customObjectList, contains(customObject));

导致AssertionError引用
Expected: iterable containing [<CustomClass@578486a3>]
but: item 0: was <CustomClass@551aa95a>

是否有解决方案,而不必逐场比较?

最佳答案

如果您使用的是Java8,则可以使用Stream#anyMatch和您自己的customEquals方法。这样的事情会起作用-

   assertTrue(customObjectList.stream()
                 .anyMatch(object -> customEquals(object,customObject)));

更新了以反射(reflect)Holger的评论

10-04 09:55