有一个简短的,通用的方式,本机的或通过公共库,有一个equals方法断言两个bean是真的丢弃空集合中的集合字段之间的差异?我需要这个用于JUnit测试,所以测试依赖性是可以的示例:
class Bus {
private List<String> passengers;
}
@Test
public void testEmptyBussesEqual() {
Bus bus1 = new Bus(null);
Bus bus2 = new Bus(new ArraysList<>());
assertTrue(specialEqual(bus1, bus2));
}
到目前为止,我最好的尝试是使用AssertJ:
assertThat(bus1)
.usingComparatorForType(new CustomListComparator(), List.class)
.usingComparatorForType(new CustomMapComparator(), Map.class)
.isEqualToComparingFieldByFieldRecursively(bus2);
其中每个Custom ... Comparator忽略null和空集合之间的差异,然后使用类似的方法递归地比较集合内容。
我的主要用例是DTO和域模型之间的映射。 DTO可能具有空字段以优化传输介质上的空间,而域模型可能更喜欢空集合以避免NullPointerException。映射代码必须经过单元测试,而null和empty之间的差异会导致笨重的测试代码。当然,用例的一个替代方案可能是配置序列化/反序列化,但这对单元测试映射器没有帮助,为了鲁棒性,仍然将空字段映射到空集合。
可能是Unitils
库ReflectionAssert
类将帮助您解决问题:
public static void assertReflectionEquals(Object expected,
Object actual,
ReflectionComparatorMode... modes)
throws junit.framework.AssertionFailedError
断言两个对象是相等的。反射用于比较这些值的所有字段。如果它们不相等则抛出AssertionFailedError。比较器模式确定比较值的严格程度。
public static void assertLenientEquals(String message,
Object expected,
Object actual)
throws junit.framework.AssertionFailedError
断言两个对象是相等的。反射用于比较这些值的所有字段。如果它们不相等则抛出AssertionFailedError。这与具有宽松顺序的assertReflectionEquals相同,并忽略设置为比较器模式的默认值。
@Test
public void testCollectionEquals() {
Collection<String> expected = null;
Collection<String> actual = new ArrayList<>();
ReflectionAssert.assertReflectionEquals(expected, actual, ReflectionComparatorMode.IGNORE_DEFAULTS);
ReflectionAssert.assertLenientEquals("Error message", expected, actual);
}