2015-11-21 8 views
19

Hamcrest bietet eine Reihe von Matcher zum Bestätigen der Inhalte einer Sammlung. passieren all diesen Fällen:Wie unterscheiden sich die hasItems, contains und containsInAnyOrder von Hamcrest?

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"); 

Wie hasItems, contains und containsInAnyOrder unterscheiden?

Antwort

25

hasItems checks:

aufeinanderfolgende Durchläufe über die untersuchte Iterable Ausbeute mindestens ein Element, das zu dem entsprechenden Elemente aus den angegebenen items gleich ist.

Das heißt, macht es sicher, dass die Sammlung enthält mindestens diese Elemente, in beliebiger Reihenfolge. Also,

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

würde auch übergeben, mit dem zusätzlichen Element ignoriert werden. Und:

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

würde auch übergeben.

contains checks:

ein einziger Durchgang über die untersuchten Iterable eine Reihe von Elementen ergibt, die jeweils logisch gleich das entsprechende Element in den angegebenen Elementen. Für eine positive Übereinstimmung muss das untersuchte iterable die gleiche Länge wie die Anzahl der angegebenen Elemente haben.

So macht es sicher, dass die Sammlung enthält genau folgende Artikel:

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

Dies würde scheitern, da die übrig gebliebenen "three" nicht abgestimmt ist.

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

Dies schlägt fehl, weil die entsprechenden Elemente nicht übereinstimmen.

Ein anderes verwandtes Matcher, containsInAnyOrder, checks, die genau diese Elemente vorhanden sind, sondern in jeder beliebigen Reihenfolge:

Erzeugt ein Auftrag agnostic Matcher für Iterables, die übereinstimmt, wenn ein einziger Durchgang über die untersuchten Iterable ergibt eine Reihe von Elemente, die jeweils logisch einem Element an den angegebenen Elementen entsprechen.

Ein Test mit einem fehlenden Punkt versagt:

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

Aber alle Artikel in einer anderen Reihenfolge vergehen:

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