[英]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.