2016-07-18 16 views
2

Gegeben Sammlungen:vergleichen Collection # unmodifiableCollection auf die Collection # singletonList in Java mit JUnit

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

Aber behaupten beide mit

assertSame(expected, actual); 

ich eine Assertion Fehler sehen:

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

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

Aber sowohl erwartet als auch tatsächlich zeigen mir den gleichen hashCode. Warum versagt der Test?

UPDATE

Nach dem Versuch, den Test mit Assert # asserEquals ich sah, dass zu erwarten ist ein SingletonList, die in keiner Weise ausführen können, um die tatsächliche UnmodifiableCollection gleich sein. Daher habe ich eine andere Frage: Was ist der beste Weg, diese beiden Arten von Sammlungen zu vergleichen.

+1

Zeigen Sie uns, wie Sie diese vergleichen. –

Antwort

1

Eine Möglichkeit, Listen zu vergleichen ist, sie zu Arrays konvertieren und zu vergleichen, die mit assertArrayEquals:

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

Um es gut funktioniert, müssen Ihre Artikel in Ihrer Liste eine korrekte equals() Methode zur Verfügung stellen.

+0

Ich denke, Ihre Antwort als "die richtige" zu markieren, aber Sie sagen, dies ist eine Möglichkeit. Ich bin nur neugierig, ob dieser Ansatz der ist, den die meisten Entwickler verwenden, um Sammlungen zu vergleichen, oder gibt es andere, denen ich bewusst sein sollte? Danke sowieso für die Bereitstellung mindestens einer Möglichkeit :) –

+0

Der Kernpunkt ist: Sie wollen nicht in das Geschäft der Vergleich zwei Objekte, die verschiedenen Sammlungsart sind. Also, die gegebene Lösung umgeht das. Ich würde nur vorschlagen, ** assertThat ** und Hamcrest ** ist ** Matcher anstelle dieser dummen assertXyzEquals Anrufe zu verwenden. – GhostCat

+0

@ Jägermeister Das mache ich eigentlich: Atm sieht aus wie 'assertThat (expectedCollection.toArray(), is (actualCollection.toArray()))'. –

1

Je nach Inhalt Ihrer Sammlungen können Sie entweder die Methoden Arrays.equals(...) oder Arrays.deepEquals(...); verwenden.

diese Weise in Ihrem Gerät zu testen Sie eine der folgenden Möglichkeiten tun können, um sie zu vergleichen:

  • 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));

Alternativ können Sie assertTrue(...);

verwenden

See full JavaDocs here

+0

Die Idee von ** assertThat ** wäre, dass es Ihnen so viel bessere Fehlermeldungen gibt als andere behauptet. Aber die Art und Weise, wie Sie es verwenden, wäre dieser Vorteil völlig verloren ... weil: Wenn die Arrays nicht gleich sind, würde das einzige, was Sie gedruckt bekommen, etwas wie "wahr! = Falsch" sein. Nicht gerade hilfreich. – GhostCat

+0

@ Jägermeister Ich stimme zu, aber ich habe nur eine schnelle Antwort geschrieben. Ich werde das entsprechend ändern;) – kstandell