assertEquals(Object, Object)
von JUnit4 / JUnit 5 oder assertThat(actual, is(expected));
von Hamcrest, die in den anderen Antworten vorgeschlagen wurden, funktionieren nur als beide equals()
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()
auf toString()
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 beide equals()
und toString()
. Es ist also durchaus gültig zu behaupten List<String>
oder List<Integer>
mit assertEquals(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:
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add("One", "Two", "Three");
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
}
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:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Assertion / Matcher-Bibliotheken sind jedoch ein Muss, da diese wirklich weiter gehen werden.
Nehmen wir jetzt an, dass Foo
nicht String
s, sondern Bar
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:
import org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple.tuple;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add(new Bar(1, "One"), new Bar(2, "Two"), new Bar(3, "Three"));
Assertions.assertThat(foo.getElements())
.extracting(Bar::getId, Bar::getName)
.containsExactly(tuple(1, "One"),
tuple(2, "Two"),
tuple(3, "Three"));
}
assertArrayEquals
heutzutage gerne . Verwendung in Kombination mitList#toArray
.