を使用するだけでなく、Hamcrestを使用しIsIterableContainingInOrder
てリストの同等性を検証する方法について明らかに混乱してい.equals()
ます。ハムクレストの有益なメッセージをレポートに表示したいと思います。
以下のテストがコンパイルすらできないのはなぜですか?それらのいくつかは、少なくとも私にとっては、他のものよりも直感に反しています。タイプパラメータは、varargsシグネチャを持つメソッドに渡すものに推測されるため、Tの配列をTのvarargsと見なし、Tに基づいてMatcherを生成するという一般原則が得られます。 Tの配列、Tの反復可能、またはそのようなもの。
最も直感的な行のいくつかが実際にコンパイルすらできない理由について、説明を使用できます。
特に:
- 図3と図4は、配列/リストの非対称性を示しています。
- 5と6は、配列ではなくリストで検索できることを示しています(?)
そのようにマークされた行のコンパイラ警告は、私にはさらに不思議です。
@org.junit.Test
public void testTest() {
String string1 = "A";
String string2 = "B";
String string3 = "C";
List<String> list1 = Lists.newArrayList(string1, string2, string3);
List<String> list2 = Lists.newArrayList(string1, string2, "C");
String[] array1 = list1.toArray(new String[list1.size()]);
String[] array2 = list2.toArray(new String[list2.size()]);
// -------------------------------------------------------------------------
// 1) The assertion after this comment line DOES NOT COMPILE
// Assert.assertThat(array2, IsIterableContainingInOrder.contains(array1));
// -------------------------------------------------------------------------
// 2) The assertion after this comment line DOES NOT COMPILE
// Assert.assertThat(list2, IsIterableContainingInOrder.contains(list1));
// -------------------------------------------------------------------------
// 3) The assertion after this comment line SUCCEEDS
Assert.assertThat(list2, IsIterableContainingInOrder.contains(array1));
// -------------------------------------------------------------------------
// 4) The assertion after this comment line DOES NOT COMPILE + HAS WARNING
// Assert.assertThat(array2, IsIterableContainingInOrder.contains(list1));
// -------------------------------------------------------------------------
// 5) The assertion after this comment line DOES NOT COMPILE
// Assert.assertThat(array2, IsIterableContainingInOrder.contains(string1));
// -------------------------------------------------------------------------
// 6) The assertion after this comment line COMPILES but fails
Assert.assertThat(list2, IsIterableContainingInOrder.contains(string1));
// -------------------------------------------------------------------------
// 7) The assertion after this comment line COMPILES and succeeds
Assert.assertThat(list2,
IsIterableContainingInOrder.contains(string1, string2, string3));
// -------------------------------------------------------------------------
}
驚愕の量。:(
PS私は、すべての驚きが私自身の無知から来ていることを理解しています。ジェネリックス、型推論、varargsなどをブラッシュアップする必要があります。これについては完全な説明を使用できます。今後数回参照することになるでしょう。
PPS私は最初にコードを読み込もうとしましたが、少しの間それを見てください...;)心のフェイントではありません:
@SuppressWarnings("unchecked")
@Factory
public static <E> Matcher<Iterable<? extends E>> contains(final Matcher<? super E> itemMatcher) {
return contains(new ArrayList<Matcher<? super E>>(asList(itemMatcher)));
}