深度反射比较等于


问题内容

我试图通过将结果对象与原始对象进行比较来验证例程的序列化和反序列化。这些例程可以序列化任意的和深层嵌套的类,因此,我需要一个比较例程,该例程可以提供原始实例和最终实例,并反射性地遍历每种值类型并比较这些值,然后迭代地浸入引用类型以比较值。

我已经尝试过Apache Commons Lang,EqualsBuilder.reflectionEquals(inst1, inst2)但这似乎并没有进行很深入的比较,它只是比较引用类型是否相等,而没有深入研究它们:

以下代码说明了我的问题。第一次调用reflectionEquals返回true,但是第二次返回false。

是否有任何人可以推荐的图书馆例程?

class dummy {
    dummy2 nestedClass;
}

class dummy2 {
    int intVal;
}

@Test
public void testRefEqu() {

    dummy inst1 = new dummy();
    inst1.nestedClass = new dummy2();
    inst1.nestedClass.intVal = 2;
    dummy inst2 = new dummy();
    inst2.nestedClass = new dummy2();
    inst2.nestedClass.intVal = 2;
    boolean isEqual = EqualsBuilder.reflectionEquals(inst1.nestedClass, inst2.nestedClass);
    isEqual = EqualsBuilder.reflectionEquals(inst1, inst2);
}

问题答案:

从这个问题的答案https://stackoverflow.com/a/1449051/116509以及一些初步测试来看,Unitils似乎可以满足ReflectionAssert.assertReflectionEquals您的期望。(编辑:但可能会被放弃,因此您可以尝试AssertJ
https://joel-costigliola.github.io/assertj/assertj-core-features-
highlight.html#field-by-field-recursive

我对EqualsBuilder的这种行为感到非常震惊,因此感谢您提出问题。在此网站上有很多推荐它的答案-我想知道推荐它的人是否意识到了这一点?