2

を使用するだけでなく、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)));
}
4

1 に答える 1

6

ここにアワーがあります...うまくいけば正しいものです:)

// 1) The assertion after this comment line DOES NOT COMPILE
// Assert.assertThat(array2, IsIterableContainingInOrder.contains(array1));

配列はIterableを実装していないため、これはコンパイルされません。

// 2) The assertion after this comment line DOES NOT COMPILE
// Assert.assertThat(list2, IsIterableContainingInOrder.contains(list1));

これが機能するためにList<List<String>>は、list2はである必要があります。これは、反復可能オブジェクトに渡されたアイテムが含まれていることを確認するだけであるためです。

// 3) The assertion after this comment line SUCCEEDS
Assert.assertThat(list2, IsIterableContainingInOrder.contains(array1));

array1がvarargと見なされるため、合格します。

// 4) & 5) 

1と同じ

// 6) The assertion after this comment line COMPILES but fails
Assert.assertThat(list2, IsIterableContainingInOrder.contains(string1));

containsは、サブセットだけでなく、コレクション内のすべてのアイテムを想定しています。

// 7)

3と同様ですが、各アイテムが渡されます。

于 2012-09-19T19:33:15.880 に答える