2016-03-14 114 views
2

爲什麼此測試失敗?我知道包含的作品,當你傳遞以逗號分隔的單獨的字符串,但我想看看是否有可能傳遞整個字符串列表。我只是想確保列表1包含列表2的所有內容。如何使用hamcrest包含比較2列表?

@Test 
public void testContains() { 
    String expected1 = "hello"; 
    String expected2 = "goodbye"; 
    List<String> expectedStrings = new ArrayList<>(); 
    expectedStrings.add(expected1); 
    expectedStrings.add(expected2); 
    List<String> actualStrings = new ArrayList<>(); 
    actualStrings.add(expected1); 
    actualStrings.add(expected2); 
    assertThat(actualStrings, contains(expectedStrings)); 
} 

是否認爲可以使用此斷言來代替?

assertThat(actualStrings, is(expectedStrings)); 
+0

containsAll而不是contains。檢查[API](https://docs.oracle.com/javase/8/docs/api/java/util/List.html#containsAll-java.util.Collection-) –

+0

@RahulSharma,所以你可以像使用' assertThat(actualStrings.containsAll(expectedStrings),(true))'? –

+0

@RahulSharma我正在尋找更多的是否有類似於List方法'containsAll'的hamcrest匹配器,所以我可以這樣做:'assertThat(actualStrings,containsAll(expectedStrings))''。我認爲它比「匹配(匹配)」更好。 –

回答

2

沒有超載的contains方法,它採用期望值的列表。

在聲明assertThat(actualStrings, contains(expectedStrings)) 以下方法(在Matchers類)被稱爲:

<E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(E... items) 

基本上你說你希望一個元素的列表,這個元素是expectedStrings但實際上它是expected1EList<String>類型,而不是String)。爲了驗證添加下面的測試然後應該通過:

List<List<String>> listOfactualStrings = new ArrayList<>(); 
listOfactualStrings.add(actualStrings); 
assertThat(listOfactualStrings, contains(expectedStrings)); 

爲了讓你不得不列表轉換爲數組斷言工作:

assertThat(actualStrings, contains(expectedStrings.toArray())); 
+0

完美運作。很好的解釋,謝謝。 –

0

如果你想申請一個列表中的每個項目的匹配器,您可以使用everyItem匹配器,如下所示:

everyItem(not(isEmptyOrNullString()))