2016-07-18 5 views
2

とJavaでコレクション#singletonListにコレクション#unmodifiableCollectionの比較:コレクション考えるとJUnitを

Collection<MyObject> expected = Collections.singletonList(new MyObject); 
Collection<MyObject> actual = Collections.unmodifiableCollection(new ArrayList<>(expected)); 

しかし、両方

assertSame(expected, actual); 

と主張し、私はアサーション・エラーを参照してください。

java.lang.AssertionError: 
expected same:<[[email protected]]> 
was not: <[[email protected]]> 

Expected :[[email protected]] 
Actual :[[email protected]] 

しかし、両方の期待と実際の私は同じhashCodeを表示しています。なぜテストが失敗するのですか?私が期待しているのを見アサート#のasserEqualsを使用してテストを実行しようとした後

UPDATE

は決して実際UnmodifiableCollectionに等しくすることができるSingletonListです。したがって、別の質問があります。これらの2つのタイプのコレクションを比較する最良の方法は何ですか。リストを比較する

+1

私たちにそれらをどのように比較するかを教えてください。 –

答えて

1

一つの方法は、assertArrayEqualsを有するものを配列と比較するためにそれらを変換することです:

assertArrayEquals(expected.toArray(), actual.toArray()); 

それがうまく動作させるために、リスト内のアイテムは、正しいequals()方法を提供する必要があります。

+0

私はあなたの答えを「正しいもの」とマークすることを検討しますが、これは一つの方法だと言います。私は、このアプローチがコレクションを比較するために開発者が使用するものであるのか、それとも私が気づくべきである他のものがあるのか​​不思議です。とにかく少なくとも1つの方法を提供していただきありがとうございます:) –

+0

コアポイントは次のとおりです。異なるコレクションタイプの2つのオブジェクトを比較するビジネスに取り掛かりたくありません。だから、与えられた解はそれを回避する。私は** assertThat **とhamcrest **は**それらのダムassertXyzEquals呼び出しの代わりに**マッチャーを使用することをお勧めします。 – GhostCat

+0

@Jägermeisterこれは私が実際に行うことです:Atmは 'assertThat(expectedCollection.toArray()、is(actualCollection.toArray()))'のように見えます。 –

1

コレクションの内容によっては、Arrays.equals(...)またはArrays.deepEquals(...);のいずれかの方法を使用できます。あなたがそれらを比較するために、次のいずれかを実行することができ、あなたのユニットテストで

その方法:

  • assertThat("Custom message for failure.", Arrays.equals(expected.toArray(), actual.toArray()), is(true));

  • assertThat("Custom message for failure.", Arrays.deepEquals(expected.toArray(), actual.toArray()), is(true));

代わりにあなたがassertTrue(...);

を使用することができます

See full JavaDocs here

+0

** assertThat **を使う考えは、他のアサーションよりもずっと優れたエラーメッセージを提供することでしょう。しかし、あなたがそれを使用している方法では、その利益は完全に失われてしまいます。なぜなら、配列が等しくないとき、あなたが印刷される唯一のものは "true!= false"のようなものでしょう。正確には役に立たない。 – GhostCat

+0

@Jägermeister私は同意するが、私は迅速な回答を投稿していただけだった。私はそれに応じて補正する;) – kstandell