私はHamcrest1.3を使用しており、よりコンパクトな方法で次のことを実現しようとしています。
次のテストケースを検討してください。
@Test
public void testCase() throws Exception {
Collection<String> strings = Arrays.asList(
"string one",
"string two",
"string three"
);
// variant 1:
assertThat(strings, hasSize(greaterThan(2)));
assertThat(strings, hasItem(is("string two")));
// variant 2:
assertThat(strings, allOf(
hasSize(greaterThan(2)),
hasItem(is("string two"))
));
}
ここでの目標は、コレクションのサイズと含まれる特定のアイテムの両方をチェックすることです。
最初のバリエーションが可能で受け入れられる場合、コレクション自体が他の操作の結果である可能性があるため、それを行うのは必ずしも簡単ではありません。したがって、allOf
操作を使用してすべての操作を行う方が理にかなっています。これは、上記の2番目のバリエーションで行われます。
ただし、2番目のバリエーションのコードを含めると、次のコンパイル時エラーが発生します。
error: no suitable method found for allOf(Matcher<Collection<? extends Object>>,Matcher<Iterable<? extends String>>)
シングルショット操作(allOf
など)を使用して、Hamcrestのコレクションのサイズとアイテムをテストする特定の方法は実際にありますか?
コンパイラはジェネリックを分類できないと思います。以下は私のために働いています(JDK 8u102):
assertThat(strings, Matchers.<Collection<String>> allOf(
hasSize(greaterThan(2)),
hasItem(is("string two"))
));
私はこの質問が古いことを知っていますが、誰かが説明を必要とする場合に備えて、それでも答えたいと思います。
allOf(...)
を使用する場合は、ネストされたマッチャーの戻り値の型が一致することを確認してください。テストケースでは、hasSize
は_org.hamcrest.Matcher<Java.util.Collection<? extends T>>
_を返しますが、hasItem
は_org.hamcrest.Matcher<Java.lang.Iterable<? super T>>
_を返します。この場合、 iterableWithSize(int size)
を使用することをお勧めします。ここで、戻り値の型は_Matcher<Java.lang.Iterable<T>>
_なので、次のことができます。
assertThat(strings, allOf( iterableWithSize(greaterThan(2)), hasItem("string two") ) );
推測:既存のマッチャーを使用してそこに到達することはありません。
しかし、独自のマッチャーを作成するのは、物事がどのように組み合わされるかを理解すれば、ほんの数分で完了します。
たぶんあなたは私の別の answer をチェックアウトします。ここで、自分のマッチャーを作成する方法の完全な例を示します。当時、それは私におそらく15分かかりました。私はこれまでカスタムマッチャーを書いたことがありませんでしたが。