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

时间:2017-12-20 05:31:57

标签: java junit javabeans

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

1 个答案:

答案 0 :(得分: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不相等   被扔了。这与使用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);
}