7

jUnit テストで、列に基づいてデータベースからいくつかの行を取得したいと考えていnameます。次に、取得した行に期待した名前があることをテストしたいと思います。私は次のものを持っています:

Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture",
    "audio equipment");
Collection<String> namesToGet = Collections2.transform(typesToGet,
    new NameFunction<MyClass, String>());
List<MyClass> typesGotten = _svc.getAllByName(typesToGet);
assertThat(typesGotten.size(), is(typesToGet.size()));
Collection<String> namesGotten = Collections2.transform(typesGotten,
    new NameFunction<ItemType, String>());
assertEquals(namesToGet, namesGotten); // fails here

現在、この失敗が発生しています:

java.lang.AssertionError: 予想: com.google.common.collect.Collections2$TransformedCollection<[オーディオ機器、家具]> だったが: com.google.common.collect.Collections2$TransformedCollection<[オーディオ機器、家具]>

nameでは、データベースから返された行が、私が望んでいた名前と一致する列を持っていることをテストする最もクリーンで簡潔な方法は何でしょうか? 1 つのリスト内の各名前が別のリストに存在することを反復して確認するループを作成することもできますが、forもっと簡潔にしたいと考えていました。次の疑似コードのようなものがいいでしょう:

List<MyClass> typesGotten = ...;
["furniture", "audio equipment"].equals(typesGotten.map(type => type.getName()))
4

4 に答える 4

15

2 回使用containsAll()して、欠損値や予期しない値がないことを確認できます。

assertTrue(namesToGet.containsAll(namesGotten));
assertTrue(namesGotten.containsAll(namesToGet));

ただし、 orの代わりにListorを使用することにした場合、インターフェイス コントラクトは、両方に同じ値が含まれている場合に、a が別の(同じ for である)と等しいことを指定します。SetCollectionListListSet

指定されたオブジェクトがこのリストと等しいかどうかを比較します。true指定されたオブジェクトもリストであり、両方のリストが同じサイズであり、2 つのリスト内の対応する要素のすべてのペアが等しい場合にのみ、を返します。(2 つの要素 e1 と e2 は、 の場合に等しいです(e1==null ? e2==null : e1.equals(e2))。)つまり、2 つのリストは、同じ要素が同じ順序で含まれている場合に等しいと定義されます。この定義により、インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されListます。


資力:

于 2012-04-09T22:09:21.580 に答える
6

このようなアサーションを作成するための最も適切で表現力豊かな方法は、Hamcrestマッチャーを使用することです。

assertThat(namesGotten, containsInAnyOrder(namesToGet))
于 2012-04-10T18:03:51.687 に答える
6

それらに同じ要素が含まれていると予想されるが、必ずしも同じ順序であるとは限らない場合は、ImmutableSet両方のコピーを作成して、それらのセットが等しいことを確認してください。それらが同じ順序であると予想される場合は、ImmutableListコピーを作成して、それらが等しいことを確認してください。

Collection平等の概念はまったくありません。

于 2012-04-09T22:23:57.357 に答える
3

Guava には、取得しようとしている概念をうまく伝えるメソッドがあります: symmetricDifference。symmetricDifference が空の場合、セットは等しいです。

assetTrue(Sets.symmetricDifference(namesToGet, namesGotten).isEmpty());

ただし、ユニオン、インターセクション、および差分操作を実行するため、「最も安価」ではない場合があります。セットが同じサイズであるかどうかを確認することもできます。そうでない場合は同じ要素が含まれていませんが、そうである場合は、(非対称)が空であることを確認できます。

assertEquals(namesToGet.size(), namesGotten.size());
assertTrue(Sets.difference(namesToGet, namesGotten));
于 2012-04-12T13:45:11.080 に答える