2

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

_assertEquals(inst.getProperties(), ance.getProrties())_不会做这项工作,因为它已被弃用。

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

提前致谢。

4

4 回答 4

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

这是使用 Hamcrest 匹配器,我认为它是进行断言的更可取的方法,因为失败的输出更具描述性。

还有一个IsArrayContainingInAnyOrderif 顺序无关紧要。

IsArrayContainingInAnyOrder

于 2012-06-06T12:57:06.540 回答
1

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

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

于 2012-06-06T11:39:46.953 回答
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]);

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

于 2012-06-06T11:48:59.603 回答
0

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"]
}
于 2015-10-23T10:20:46.513 回答