2012-12-14 35 views
2

我想與Hamcrest匹配整數列表,看看幾個在線的例子,但我得到運行時異常。如何用Hamcrest聲明一個通用的整數列表?

有些請讓我知道什麼是正確的語法?

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); 
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(1)))); 
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(2)))); 
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(3)))); 
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(4)))); 
assertThat((List<Object>) numbers, hasItem(hasProperty("value", is(5)))); 

感謝

+0

你想要聲明的是什麼? –

+1

我不知道Hamcrest,但是這看起來像你希望java.lang.Integer有一個屬性「值」(它不)。 – Thilo

回答

6

如果列表項的順序並不重要:

assertThat(numbers, hasItems(1, 2, 3, 4, 5)); 

如果確實如此:

assertThat(numbers, is(equalTo(Arrays.asList(1, 2, 3, 4, 5)))); 

如果集合不應包括其他元素,然後還檢查大小:

assertThat(numbers, hasSize(5)); 
+0

如果你想測試'numbers'只包含一組特定的項目,除了做這裏描述的'hasItems'斷言之外,一定要聲明列表的大小。 – pholser

+0

@pholser這是很好的建議,我把它列入答案。謝謝。 –

+0

還有其他的匹配器將檢查大小和元素結合起來 - 請參閱我的答案。 – Kkkev

1

只需使用

assertThat(numbers, hasItem(1)); 
... 

或者

assertThat(numbers, hasItems(1, 2, 3, 4, 5)); 

順序無所謂這裏。

+0

什麼是正確的靜態導入? – user465374

+0

@ user465374:import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasItems; – looper

1

要驗證該集合包含的具體項目:

assertThat(numbers, hasItem(3)); 

要驗證集合包含幾個項目:

assertThat(numbers, hasItems(3, 4)); 

要驗證該集合只包含的具體項目:

assertThat(numbers, contains(1, 2, 3, 4, 5)) 

要驗證集合是否包含特定項目,請勿操作左右排序:

assertThat(numbers, containsInAnyOrder(5, 4, 3, 1, 2))