繁体   English   中英

如何在JUnit中检查两个对象数组是否相等?

[英]How can I check two Object-Arrays for Equality in JUnit?

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

_assertEquals(inst.getProperties(), ance.getProrties())_不会执行此工作,因为它已被弃用。

而且由于NoName类是一个库类,所以我不能覆盖equals() (就目前为止,这似乎是解决此类问题的常用方法)。

提前致谢。

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

我使用的是Hamcrest Matcher,我认为这是执行断言的首选方法,因为失败时的输出更具描述性。

如果顺序无关紧要,则还有一个IsArrayContainingInAnyOrder

IsArrayContainingInAnyOrder

由于您正在谈论比较对象的内部结构,因此可以覆盖NoName类的equals方法,并在内部比较两个对象的属性数组。 但是,然后,您还需要注意hashCode方法。

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

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]);

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

Hamcrest 1.3使用稍微不同的语法,例如:

import static org.hamcrest.collection.IsArrayContainingInOrder.arrayContaining;

...

@Test
public void inOrder1() {
    assertThat(new String[]{"foo", "bar"}, arrayContaining(equalTo("foo"), equalTo("bar")));
}

@Test(expected =  AssertionError.class)
public void inOrder2() {
    assertThat(new String[]{"bar", "foo"}, arrayContaining(equalTo("foo"), equalTo("bar")));
    // Expected: ["foo", "bar"]
    //      but: item 0: was "bar"
}

@Test(expected =  AssertionError.class)
public void inOrder3() {
    assertThat(new String[]{"foo", "bar", "lux"}, arrayContaining(equalTo("foo"), equalTo("bar")));
    // Expected: ["foo", "bar"] in any order
    //      but: Not matched: "lux"
}

@Test(expected =  AssertionError.class)
public void inOrder4() {
    assertThat(new String[]{"foo", "bar"}, arrayContaining(equalTo("foo"), equalTo("bar"), equalTo("lux")));
    // Expected: ["foo", "bar", "lux"] in any order
    //      but: No item matched: "lux" in ["foo", "bar"]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM