web-dev-qa-db-ja.com

Hamcrestで複数の正しい結果(or-matcherはありますか?)

私はマッチャーには比較的新しいです。私は hamcrest をJUnitと組み合わせていじっていますが、ちょっと気に入っています。

複数の選択肢のいずれかが正しいことを述べる方法はありますか?

何かのようなもの

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

私がテストしているメソッドは、コレクションの1つの要素を返します。リストには複数の候補が含まれる場合があります。現在の実装では最初のヒットが返されますが、これは要件ではありません。可能性のある候補のいずれかが返された場合、テストケースが成功することを望みます。これをJavaでどのように表現しますか?

(私はハムクレストの代替案を受け入れています)

70
Mo.
assertThat(result, anyOf(equalTo(1), equalTo(2), equalTo(3)))

Hamcrestチュートリアル から:

anyOf-いずれかのマッチャーが一致する場合、短絡(Java ||)など)

Javadoc も参照してください。

さらに、独自のMatcherを作成することもできます。これは非常に簡単です。

107
marcospereira

marcosは正しいですが、他にもいくつかのオプションがあります。まず、isis/or:

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

しかし、3つ以上のアイテムがある場合、おそらく扱いにくいでしょう。加えて、タイプチェッカーは時々そのようなもので奇妙になります。あなたの場合、次のことができます:

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

または、配列/コレクションにすでにオプションがある場合:

assertThat(result, isIn(theCollection))

Javadoc も参照してください。

78
MatrixFrog