Mehrere korrekte Ergebnisse mit Hamcrest (gibt es einen Or-Matcher?)

76

Ich bin relativ neu für Matcher. Ich spiele mit Hamcrest in Kombination mit JUnit herum und es gefällt mir irgendwie.

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

Etwas wie

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

Die Methode, die ich teste, gibt ein Element einer Sammlung zurück. 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ürden Sie dies in Java ausdrücken?

(Ich bin offen für Hamcrest-Alternativen)

Mo.
quelle

Antworten:

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

Aus dem Hamcrest-Tutorial :

anyOf - stimmt überein, wenn Matcher übereinstimmen, Kurzschlüsse (wie Java ||)

Siehe auch Javadoc .

Außerdem können Sie Ihren eigenen Matcher schreiben, was ganz einfach ist.

marcospereira
quelle
81

marcos hat recht, aber Sie haben noch ein paar andere Möglichkeiten. Zuallererst gibt es ein entweder / oder:

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

aber wenn Sie mehr als zwei Gegenstände haben, würde es wahrscheinlich unhandlich werden. Außerdem wird der Typechecker manchmal komisch. Für Ihren Fall könnten Sie Folgendes tun:

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

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

assertThat(result, isIn(theCollection))

Siehe auch Javadoc .

MatrixFrog
quelle
Hmmm ... aus irgendeinem unerklärlichen Grund hat meine Eclipse-Umgebung (die erst ungefähr 6 Monate alt ist) eine alte Hamcrest-Bibliothek und ich bekomme diese Extras nicht.
CurtainDog
Nun, assertThat((Set<String>)null, is(either(empty()).or(nullValue())));gibt mir einen ziemlich seltsamen Assertionsfehler: Expected: is (an empty collection or null) but: was nullfür Hamcrest 1.3...
Jezor
isOneOf () scheint jetzt veraltet zu sein.
Jolta