[英]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
。
由于您正在谈论比较对象的内部结构,因此可以覆盖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.