2015-11-21 51 views
19

Hamcrest提供了許多用於聲明集合內容的匹配器。所有這些情況下,通過:Hamcrest的hasItems,contains和containsInAnyOrder有何不同?

Collection<String> c = ImmutableList.of("one", "two", "three"); 
assertThat(c, hasItems("one", "two", "three"); 
assertThat(c, contains("one", "two", "three"); 
assertThat(c, containsInAnyOrder("one", "two", "three"); 

如何hasItemscontainscontainsInAnyOrder有什麼不同?

回答

25

hasItems checks

在檢查可迭代收率的至少一個項目,其等於從指定items相應的項目連續傳球。

也就是說,它可以確保集合包含至少這些項目,以任意順序。所以,

assertThat(c, hasItems("one", "two")); 

也會通過,與多餘的項目被忽略。並且:

assertThat(c, hasItems("three", "two", "one")); 

也會通過。

contains checks

單個傳過來的檢查Iterable產生了一系列項目,每個邏輯上等於相應項目中指定項。對於肯定匹配,被檢查的迭代必須與指定項目的數量具有相同的長度。

所以它確保集合包含正是這些項目:

assertThat(c, contains("one", "two")); // Fails 

這將失敗,因爲剩下的"three"不匹配。

assertThat(c, contains("three", "two", "one")); // Fails 

由於相應的項目不匹配而失敗。

另一個相關的匹配,containsInAnyOrderchecks恰好這些項目都存在,但在任何順序:

創建用於Iterables的順序無關的匹配器匹配當單個傳過來的檢查Iterable產生一系列項目,每個項目在邏輯上等於指定項目中任何位置的一個項目。

一個缺失項目測試失敗:

assertThat(c, containsInAnyOrder("one", "two")); // Fails 

但以不同的順序所有項目將通過:

assertThat(c, containsInAnyOrder("three", "two", "one"));