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)

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.


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 .


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.