是否有一种简短的泛型方式,本机或通过公共库,有一个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和empty集合之间的差异,然后使用类似的方法递归地比较集合内容。
我的主要用例是DTO和域模型之间的映射。 DTO可能具有空字段以优化传输介质上的空间,而域模型可能更喜欢空集合以避免NullPointerException。映射代码必须经过单元测试,而null和empty之间的差异会导致笨重的测试代码。 当然,用例的一个替代方案可能是配置序列化/反序列化,但这对单元测试映射器没有帮助,为了鲁棒性,仍然将空字段映射到空集合。
答案 0 :(得分:1)
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不相等 被扔了。这与使用lenient的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);
}