2008-09-30 11 views
61

Ich bin relativ neu bei Matcher. Ich spiele mit hamcrest in Kombination mit JUnit und ich mag es irgendwie.Mehrere korrekte Ergebnisse mit Hamcrest (gibt es einen or-Matcher?)

Gibt es eine Möglichkeit zu sagen, dass eine von mehreren Möglichkeiten richtig ist?

So etwas wie

assertThat(result, is(either(1, or(2, or(3))))) //does not work in hamcrest 

Die Methode Ich teste kehrt ein Element aus einer Sammlung. Die Liste kann mehrere Kandidaten enthalten. Meine aktuelle Implementierung gibt den ersten Treffer zurück, aber das ist keine Voraussetzung. Ich möchte, dass mein Testfall erfolgreich ist, wenn einer der möglichen Kandidaten zurückgegeben wird. Wie würdest du das auf Java ausdrücken?

(Ich bin offen für hamcrest-Alternativen)

Antwort

91
assertThat(result, anyOf(equalTo(1), equalTo(2), equalTo(3))) 

Von Hamcrest tutorial:

Bestimmungen haften - Streichhölzer, wenn irgendwelche Matcher übereinstimmen, Kurzschluss (wie Java ||)

Siehe auch Javadoc.

Darüber hinaus könnten Sie Ihren eigenen Matcher schreiben, was ziemlich einfach ist.

71

marcos ist richtig, aber Sie haben ein paar andere Optionen. Zunächst einmal gibt es ist ein entweder/oder:

assertThat(result, either(is(1)).or(is(2))); 

aber wenn Sie mehr als zwei Elemente haben wäre es wahrscheinlich unhandlich bekommen. Außerdem wird der Typchecker manchmal so komisch. Für Ihren Fall könnten Sie tun:

assertThat(result, isOneOf(1, 2, 3)) 

oder wenn Sie bereits Ihre Optionen in einem Array/Sammlung haben:

assertThat(result, isIn(theCollection)) 

Siehe auch Javadoc.

+0

Hmmm ... Aus unerklärlichen Gründen hat meine Eclipse-Umgebung (die nur etwa 6 Monate alt ist) eine alte Hamcrest-Bibliothek und ich bekomme diese Leckereien nicht. – CurtainDog