如何在JUnit中检查两个Object-Arrays for Equality?

时间:2012-06-06 11:31:37

标签: java junit equals junit4 assert

我有一个JAVA类 NoName ,其对象的方法是 getProperties()。此方法返回 Property 的数组。 当我现在有两个 NoName 的实例时,如何使用 assertEquals 来检查两个实例的 Property -Arrays是否相同?

_assertEquals(inst.getProperties(), ance.getProrties())_将无法胜任,因为它已被弃用。

由于 NoName 类是一个库类,我不能覆盖 equals()(这似乎是这类问题的常用解决方案,就我而言读到现在。)

提前致谢。

4 个答案:

答案 0 :(得分:4)

assertThat(ob1.getProperties(), 
    IsArrayContainingInOrder.contains(obj2.getProperties));

这是使用Hamcrest匹配器,我认为这是一种更好的断言方法,因为失败时的输出更具描述性。

如果订单无关紧要,还有一个IsArrayContainingInAnyOrder

IsArrayContainingInAnyOrder

答案 1 :(得分:1)

由于您正在讨论比较对象的内部结构,您可以覆盖equals类的NoName方法,并在其中比较两个对象的属性数组。但是,您还需要处理hashCode方法。

或者,您可以在hasSameProperties(NoName obj)类中创建辅助方法NoName,并在比较两个对象的属性数组后使该方法返回布尔标志。然后在JUnit中,您只需使用assertTrue方法。

答案 2 :(得分:0)

Property[] one = inst.getProperties(), two = ance.getProperties();
assertEquals(one.length, two.length);
for (int i=0; i<one.length; i++) assertEquals("index #" + i, one[i], two[i]);

这提供了基本的擦洗。如果您担心其他一些边缘条件(例如,类似于数组可能为null,或者只要每个数组都包含相同的元素,则允许数组具有不同的顺序),那么将需要一些额外的工作(例如,空检查,Property实现Comparable时的排序。)

答案 3 :(得分:0)

Hamcrest 1.3使用略有不同的语法,例如:

{{1}}