2

この古い質問への回答では、コレクションに対するアサートに Hamcrest を推奨しています。

コレクションにオブジェクトの複数のインスタンスがあると主張したい場合はどうなりますか?

list = newArrayList();
list.add(1);
list.add(1);
list.add(2);
assertThat(list, hasItems(1, 2, 2)); // This should fail
assertThat(list, hasItems(1, 2, 1)); // This should pass

私が試した hamcrest コードは多重度を気にしません - 上記のアサートは両方ともパスします。

4

6 に答える 6

2

Guava'sMultisetは、要素の複数の出現を効率的に追跡することを目的としています。

Multiset<E> multiset = HashMultiset.create(collection);

そして、xifが複数回出現しますmultiset.count(x) > 1

于 2012-02-08T23:28:39.313 に答える
1
assertEquals(2, Collections.frequency(list, 1));
assertEquals(1, Collections.frequency(list, 2));

もちろん、必要に応じてこれに Hamcrest 記法を使用することもできます。

そして、利点は他のいくつかの回答に比べて倍増します。コレクションの所有者ではない可能性があるため、使用する実装を制御できない場合があります。さらに、この手法を使用できるコレクションのタイプ (リスト、セットなど) に制限されません。

質問をありがとう、私はそうでなければこれについて考えなかったでしょう:-)

于 2012-02-11T02:28:02.170 に答える
0

自分で別のアサーションを書きます。このアサーションでは、次の手法を使用できます。

  • コレクションを新しいリストにコピーする
  • 存在する必要がある各要素について、存在するかどうかをテストし、リストから削除します
  • オブジェクトのインスタンスがこれ以上ないことを確認したい場合は、要素ごとに、それがリストにないことをテストします。
于 2012-02-08T08:16:46.350 に答える
0

私だけかもしれませんが、HashMapはあなたの友達のようです。私は何かが恋しいですか?

于 2012-02-08T08:22:36.557 に答える
0

私が考えることができる最も簡単な手法は、最初にリストを並べ替えてから、等値比較を使用することです。

Collections.sort(list);

その後:

assertEquals(Arrays.asList(1, 1, 2), list);
于 2012-02-08T08:22:42.870 に答える
0

基本的にキーのマップ->値のリストであるグアバのマルチマップを使用できます。この場合、値のリストはあまり気にしませんが、そのサイズは重要です。リストから次のマルチマップを作成します。

1 -> [1, 1]
2 -> [2]

その後、次のことができます

Assert.assertEquals(2, map.get(1).size());

これにより、元のリストに「1」が正確に 2 つあることが確認されます。

Guava に依存したくない場合は、各数値からそのカウントへのマップを作成するだけです。これには、もう少し簿記が必要ですが、全体的には非常に単純です。

于 2012-02-08T18:27:25.317 に答える