2012-02-08 129 views
2

this old question的回答建議Hamcrest對集合進行斷言。斷言一個集合在Java中有多個項目實例?

如果我想斷言一個集合有多個對象實例會發生什麼?

list = newArrayList(); 
list.add(1); 
list.add(1); 
list.add(2); 
assertThat(list, hasItems(1, 2, 2)); // This should fail 
assertThat(list, hasItems(1, 2, 1)); // This should pass 

我試過的hamcrest代碼並不在乎多重性 - 上面的斷言都會通過。

回答

0

我能想到的最簡單的方法是先排序列表,然後用平等的比較:

Collections.sort(list); 

然後:

assertEquals(Arrays.asList(1, 1, 2), list); 
+0

我會接受這個,直到有更好的東西出現,謝謝。 – ripper234 2012-02-08 09:58:53

0

自己寫一個斷言。這種說法可以使用以下方法:

  • 副本收集到一個新的列表
  • 對於必須存在於每個元素,測試,如果是這樣,如果你想從列表
  • 刪除檢查一個對象沒有更多的實例,然後對每個元素測試它不在列表中。
0

也許這只是我,但看起來像HashMap是你的朋友。我想念什麼?

+1

也許。我正在尋找一種能夠讓我堅持收藏的單行書,尊重多樣性。當然,我可以*使用hashmap *構建一個,但這不是一個好的答案......它不提供任何新的信息。 「自己構建」是默認的答案,所以它不會添加太多信息。 – ripper234 2012-02-08 08:28:03

+0

我相信我的回答是有建設性的,因爲如果收集人口在你的控制之下,爲什麼不選擇適合目的的適當收藏?如果這不是這種情況(集合是外部填充的),我建議你以某種方式改寫你的問題,人們可以真正理解你在找什麼。 – aviad 2012-02-08 09:47:54

0

您可以使用番石榴的Multimap之,這基本上是一個地圖鍵 - >值列表。在這種情況下,你不關心值的列表,但它的大小。你會從你的列表創建以下多重映射:

1 -> [1, 1] 
2 -> [2] 

然後你可以

Assert.assertEquals(2, map.get(1).size()); 

這可以確保恰好有兩個「1」「在你原來的列表中。

如果你不想依靠番石榴,只需創建一個每個數字的地圖到它的計數,這需要更多的簿記,但總體上仍然非常簡單。

+0

...爲什麼你會用這個,而不是'Multiset'? – 2012-02-08 18:44:35

+0

Doh,當然,我在想什麼...... – 2012-02-08 23:26:02

2

番石榴的Multiset旨在有效地跟蹤元素的多次出現。

Multiset<E> multiset = HashMultiset.create(collection); 

,然後你如果multiset.count(x) > 1x多次出現。

1
assertEquals(2, Collections.frequency(list, 1)); 
assertEquals(1, Collections.frequency(list, 2)); 

當然,如果你願意,你可以使用Hamcrest符號。

這個優點在一些其他答案中是多方面的:您可能不是集合的所有者,因此您可能無法控制要使用的實現。此外,您不限於可以使用此技術的集合類型(列表,集合等)。

感謝您的問題,我不會想到這個,否則:-)

+0

Perfecto。最小的麻煩,並讓JDK庫來完成這項工作。 – pholser 2012-02-24 21:32:13

相關問題