Wie kann ich in einem JUnit- Testfall eine Gleichheitserklärung zwischen Listen abgeben ? Gleichheit sollte zwischen dem Inhalt der Liste bestehen.
Beispielsweise:
List<String> numbers = Arrays.asList("one", "two", "three");
List<String> numbers2 = Arrays.asList("one", "two", "three");
List<String> numbers3 = Arrays.asList("one", "two", "four");
// numbers should be equal to numbers2
//numbers should not be equal to numbers3
java
unit-testing
collections
junit
Kamal
quelle
quelle
assertArrayEquals
heutzutage gerne . Verwendung in Kombination mitList#toArray
.assertArrayEquals
erfordert, dass Sie Arrays von Ihren Listen erhalten. Sie können direkt auf der Liste mitassertIterableEquals
assertIterableEquals
verfügbar für jUnit5 @ThetaSinnerAntworten:
Mir ist klar, dass dies vor ein paar Jahren gefragt wurde, wahrscheinlich gab es diese Funktion damals noch nicht. Aber jetzt ist es einfach:
Wenn Sie eine aktuelle Version von Junit mit hamcrest installiert haben, fügen Sie einfach die folgenden Importe hinzu:
http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T, org.hamcrest.Matcher)
http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html
quelle
System.out.println(actual == expected);
wird false zurückgeben,System.out.println(actual.equals(expected));
wird aber true zurückgeben..equals(..)
anstelle von==
?Nicht in String verwandeln und vergleichen. Das ist nicht gut für die Leistung. In der Junit, innerhalb von Corematchers, gibt es einen Matcher dafür =>
hasItems
Dies ist der bessere Weg, um Elemente in einer Liste zu überprüfen.
quelle
Assert.assertEquals(4,yourList.size());
assertThat(yourList.toArray(), arrayContainingInAnyOrder(1,2,3,4,5));
toString()
Version nicht der beste Weg.Dies ist eine Legacy-Antwort, die für JUnit 4.3 und niedriger geeignet ist. Die moderne Version von JUnit enthält integrierte lesbare Fehlermeldungen in der assertThat-Methode. Bevorzugen Sie nach Möglichkeit andere Antworten auf diese Frage.
Für die Aufzeichnung, wie @Paul in seinem Kommentar zu dieser Antwort erwähnte, zwei
List
s gleich:Siehe die JavaDocs der
List
Schnittstelle .quelle
assertEquals(Object, Object)
von JUnit4 / JUnit 5 oderassertThat(actual, is(expected));
von Hamcrest, die in den anderen Antworten vorgeschlagen wurden, funktionieren nur als beideequals()
undtoString()
werden für die Klassen (und tief) der verglichenen Objekte überschrieben.Es ist wichtig, weil der Gleichheitstest in der Behauptung davon abhängt
equals()
auftoString()
die verglichenen Objekte und die Testfehlermeldung auf diese stützt .Für integrierte Klassen wie
String
,Integer
und so für ... kein Problem , da diese überschreiben beideequals()
undtoString()
. Es ist also durchaus gültig zu behauptenList<String>
oderList<Integer>
mitassertEquals(Object,Object)
.Und zu diesem Thema: Sie müssen
equals()
in einer Klasse überschreiben, weil dies im Hinblick auf die Objektgleichheit sinnvoll ist, nicht nur, um Aussagen in einem Test mit JUnit zu vereinfachen.Um die Behauptungen zu vereinfachen, haben Sie andere Möglichkeiten.
Als gute Praxis bevorzuge ich Assertion / Matcher-Bibliotheken.
Hier ist eine AssertJ- Lösung.
org.assertj.core.api.ListAssert.containsExactly()
ist das, was Sie brauchen: Es überprüft, ob die tatsächliche Gruppe genau die angegebenen Werte und nichts anderes enthält, in der Reihenfolge, wie im Javadoc angegeben.Angenommen, eine
Foo
Klasse, in der Sie Elemente hinzufügen und in der Sie diese erhalten können.Ein Unit-Test davon bestätigt
Foo
, dass die beiden Listen den gleichen Inhalt haben könnten:Ein guter Punkt von AssertJ ist, dass es
List
unnötig ist, a wie erwartet zu deklarieren : Dadurch wird die Assertion gerader und der Code lesbarer:Assertion / Matcher-Bibliotheken sind jedoch ein Muss, da diese wirklich weiter gehen werden.
Nehmen wir jetzt an, dass
Foo
nichtString
s, sondernBar
s Instanzen gespeichert werden.Das ist ein sehr häufiges Bedürfnis. Mit AssertJ ist die Behauptung immer noch einfach zu schreiben. Besser können Sie behaupten, dass der Listeninhalt gleich ist, auch wenn die Klasse der Elemente nicht überschreibt,
equals()/hashCode()
während JUnit dies erfordert:quelle
Wenn Sie sich nicht für die Reihenfolge der Elemente interessieren, empfehle ich
ListAssert.assertEquals
in Junit-Addons.Link: http://junit-addons.sourceforge.net/
Für faule Maven-Benutzer:
quelle
Sie können assertEquals in junit verwenden .
Wenn die Reihenfolge der Elemente unterschiedlich ist, wird ein Fehler zurückgegeben.
quelle
Wenn Sie keine Array-Liste erstellen möchten, können Sie dies auch versuchen
quelle
quelle
Das Rad nicht neu erfinden!
Es gibt eine Google Code-Bibliothek, die dies für Sie erledigt : Hamcrest
quelle
Ich weiß, dass es bereits viele Möglichkeiten gibt, dieses Problem zu lösen, aber ich würde lieber Folgendes tun, um zwei Listen in irgendeiner Reihenfolge zu behaupten :
quelle
assertEquals(expected, result);
funktioniert bei mir. Da diese Funktion zwei Objekte erhält, können Sie alles an sie übergeben.quelle
Ich weiß nicht, dass alle oben genannten Antworten die genaue Lösung für den Vergleich zweier Objektlisten darstellen. Die meisten der oben genannten Ansätze können hilfreich sein, um nur die Vergleichsgrenze einzuhalten - Größenvergleich - Referenzvergleich
Wenn wir jedoch gleich große Objektlisten und unterschiedliche Daten auf Objektebene haben, helfen diese Vergleichsansätze nicht weiter.
Ich denke, der folgende Ansatz funktioniert perfekt mit überschreibenden Gleichheits- und Hashcode-Methoden für das benutzerdefinierte Objekt.
Ich habe Xstream lib zum Überschreiben von Equals und Hashcode verwendet, aber wir können Equals und Hashcode auch durch gewonnene Logik / Vergleich überschreiben.
Hier ist das Beispiel als Referenz
Das Wichtigste ist, dass Sie die Felder durch Annotation (@XStreamOmitField) ignorieren können, wenn Sie keine Felder in die gleiche Prüfung von Objekten aufnehmen möchten. Es gibt viele solche Annotationen, die konfiguriert werden müssen. Schauen Sie sich also die Annotationen dieser Bibliothek genau an.
Ich bin sicher, diese Antwort wird Ihnen Zeit sparen, um den richtigen Ansatz für den Vergleich zweier Objektlisten zu finden :). Bitte kommentieren Sie, wenn Sie Probleme dazu sehen.
quelle