2017-03-27 54 views
2

我正在使用AssertJ,我試圖斷言兩個List<String>包含相同的字符串,忽略順序。如何斷言兩個列表<String>是相等的,忽略順序

List<String> expected = Arrays.asList("Something-6144-77.pdf", "d-6144-77.pdf", "something-6144-78.pdf", "Something-6144-8068.pdf"); 
List<String> actual = new ArrayList<String>(); 

assertThat(actual.size()).isEqualTo(expected.size()); 

// This line gives the error: "The method containsExactlyInAnyOrder(String...) in the type ListAssert<String> is not applicable for the arguments (List<String>)" 
assertThat(actual).containsExactlyInAnyOrder(expected); 

如何解決低於編譯錯誤試圖使用containsExactlyInAnyOrder()時出現?

「在類型ListAssert的方法containsExactlyInAnyOrder(字符串...)不適用的參數(列表)」

回答

2

錯誤消息爲您提供瞭解決方案:

The method containsExactlyInAnyOrder(String...) 

String...是任何數量的字符串,但可以作爲數組傳遞,以及:

assertThat(actual).containsExactlyInAnyOrder((String[]) expected.toArray(new String[expected.size()])); 

演員是必要這裏的代碼是假設expected元素的創建方式與您的示例中創建的元素不同,因爲將數組轉換爲列表並返回沒有意義。

這裏是一些文檔,以可變參數(任意數量的參數,該...):https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

2

由於該方法需要String...,你應該傳遞一個數組,而不是清單:

String[] expected = new String[] { 
    "Something-6144-77.pdf" 
, "d-6144-77.pdf" 
, "something-6144-78.pdf" 
, "Something-6144-8068.pdf" 
}; 

或項目列表中調用它內聯:

assertThat(actual).containsExactlyInAnyOrder(
    "Something-6144-77.pdf" 
, "d-6144-77.pdf" 
, "something-6144-78.pdf" 
, "Something-6144-8068.pdf" 
); 
2

兩個問題的答案(by jlordoby dasblinkenlight)工作,但解決方法,而不是做的正確方法。

AssertJ庫中有一種方法,用於專門檢查List是否包含另一個Iterable中的所有值(不管順序如何)。這就是所謂的containsOnlyElementsOf()

public SELF containsOnlyElementsOf(Iterable<? extends ELEMENT> iterable)

同一語義爲ObjectEnumerableAssert.containsOnly(Object[]):驗證實際包含給定迭代,別無其他的所有元素,以任何順序。

例子:

Iterable<Ring> rings = newArrayList(nenya, vilya);

// assertion will pass


// assertion will fail as actual does not contain narya
assertThat(rings).containsOnlyElementsOf(newLinkedList(nenya, vilya, narya));
// assertion will fail as actual contains nenya assertThat(rings).containsOnlyElementsOf(newLinkedList(vilya));

所以,這種方法是你應該使用,如下面的一個。沒有必要將您的List投射或轉換爲Array

assertThat(actual).containsOnlyElementsOf(expected); 

作爲一個側面說明,你對列表的大小斷言是多餘的:

assertThat(actual.size()).isEqualTo(expected.size()); 

這已經涵蓋了斷言列表包含相同的元素。

最後,如果你確實需要斷言列表具有特定的站點,AssertJ有這樣的內置方法(hasSameSizeAs()):

assertThat(actual).hasSameSizeAs(expected); 
相關問題