濫用

2013-02-18 64 views
8

我有一個整數(電流)的列表,我要檢查這個列表中是否包含從預期列表甚至沒有一個元素從列表notExpected所有元素,所以代碼如下所示:濫用

List<Integer> expected= new ArrayList<Integer>(); 
    expected.add(1); 
    expected.add(2); 

    List<Integer> notExpected = new ArrayList<Integer>(); 
    notExpected.add(3); 
    notExpected.add(4); 

    List<Integer> current = new ArrayList<Integer>(); 
    current.add(1); 
    current.add(2); 


    assertThat(current, not(hasItems(notExpected.toArray(new Integer[expected.size()])))); 

    assertThat(current, (hasItems(expected.toArray(new Integer[expected.size()])))); 

只要這麼好。但是當我加入

current.add(3); 

測試也是綠色的。我濫用Hamcrest匹配器嗎? Btw。

for (Integer i : notExpected) 
     assertThat(current, not(hasItem(i))); 

給了我正確的答案,但我認爲我只是可以輕鬆地使用hamcrest匹配器。我使用JUnit 4.11和1.3 hamcrest

回答

9

hasItems(notExpected...)只會匹配current如果從notExpected所有元素current者也。因此與線

assertThat(current, not(hasItems(notExpected...))); 

你斷言current不包含全部來自notExpected元素

一個解決方案斷言current不包含任何元素notExpected

assertThat(current, everyItem(not(isIn(notExpected)))); 

,然後你甚至不用到列表轉換爲數組。這種變異可能多一點可讀性,但需要轉換爲數組:

assertThat(current, everyItem(not(isOneOf(notExpected...)))); 

注意,這些匹配不是來自CoreMatchershamcrest-core,所以你需要添加hamcrest-library的依賴。

<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-library</artifactId> 
    <version>1.3</version> 
</dependency>