2013-02-18 7 views
8

Ich habe eine Liste von ganzen Zahlen (Strom) und ich möchte überprüfen, ob diese Liste alle Elemente aus der Liste enthält erwartet und nicht einmal ein Element aus der Liste notExpected, so Code wie folgt aussieht:Missbrauch von hamcrest HasItems

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()])))); 

So lange so gut. Aber wenn ich

current.add(3); 

hinzufügen, ist der Test auch grün. Habe ich den Hamcrest Matcher missbraucht? BTW.

gibt mir die richtige Antwort, aber ich dachte, dass ich einfach den Hamcrest Matcher dafür verwenden kann. Ich verwende junit 4.11 und hamcrest 1,3

Antwort

9

hasItems(notExpected...) würde nur current übereinstimmen, wenn alle Elemente von notExpected auch in current waren. Also mit der Linie

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

Sie behaupten, dass current nicht enthält alle Elemente von notExpected.

Eine Lösung zu behaupten, dass current nicht keine Elemente enthält von notExpected:

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

und dann haben Sie nicht einmal die Liste Array zu konvertieren. Diese Variante vielleicht ein bisschen besser lesbar, erfordert aber Umwandlung in Array:

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

Beachten Sie, dass diese Matcher nicht von CoreMatchers in hamcrest-core sind, so dass Sie eine Abhängigkeit von hamcrest-library hinzufügen müssen.

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