【问题标题】:How can I check two Object-Arrays for Equality in JUnit?如何在 JUnit 中检查两个对象数组是否相等?
【发布时间】:2012-06-10 10:02:39
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

标签: java junit equals junit4 assert


【解决方案1】:

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

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

【讨论】:

  • 我无法写入NoName 类。它是图书馆的一部分。
【解决方案2】:
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 在这里是一个更好的选择,但如果使用此机制,则应提供“原因”:assertEquals("index #" + i, one[i], two[i]); 否则提供的错误消息将毫无用处。
  • @John B:很好,我将对答案进行调整。重新 Hamcrest,是的,但是:这是一个取决于规模的工程问题 - 进行测试的组织,测试此代码等。如果这是一个快速的(例如,帮助小规模调试的 junit),它可能是比任何其他信息都值得更麻烦的排序获取正确的库路径。
  • 啊,Maven的美丽。我总是只是想“哦,我将添加该依赖项。”
【解决方案3】:
assertThat(ob1.getProperties(), 
    IsArrayContainingInOrder.contains(obj2.getProperties));

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

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

IsArrayContainingInAnyOrder

【讨论】:

  • 这是一个我必须包含在我的工作区中的特殊库吗?因为那样它就无法完成这项工作。
  • 它在 Hamcrest 库中。一小部分 Hamcrest Matchers 位于 JUnit jar 中,但其余部分位于 Hamcrest-core 和 Hamcrest-all jar 中。我建议您在类路径中比 JUnit jar 更早地列出这两个 jar,以确保在默认 JUnit 匹配器之前获得这些匹配器。
【解决方案4】:

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"]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多