比较Java Bean忽略空/空集合差异

问题描述 投票:0回答:1

有一个简短的,通用的方式,本机的或通过公共库,有一个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之间的差异会导致笨重的测试代码。当然,用例的一个替代方案可能是配置序列化/反序列化,但这对单元测试映射器没有帮助,为了鲁棒性,仍然将空字段映射到空集合。

java junit javabeans
1个回答
1
投票

可能是UnitilsReflectionAssert类将帮助您解决问题:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.