簡體   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