assertEquals(Object, Object)z JUnit4 / JUnit 5 lub assertThat(actual, is(expected));z Hamcrest zaproponowane w innych odpowiedziach będą działać tylko jako oba equals()i toString()są nadpisywane dla klas (i głęboko) porównywanych obiektów.
Ma to znaczenie, ponieważ test równości w asercji opiera się, equals()a komunikat o niepowodzeniu testu opiera się toString()na porównywanych obiektach.
Dla wbudowanych klas, takich jak String, Integeri tak za ... nie ma problemu, ponieważ te zastępują zarówno equals()i toString(). Tak więc jest to całkowicie słuszne, aby twierdzić List<String>lub List<Integer>z assertEquals(Object,Object).
A jeśli chodzi o tę sprawę: musisz nadpisać equals()w klasie, ponieważ ma to sens z punktu widzenia równości obiektów, a nie tylko po to, aby ułatwić asercje w teście z JUnit.
Aby ułatwić asercje, masz inne sposoby.
Jako dobrą praktykę preferuję biblioteki asercji / dopasowań.
Oto rozwiązanie AssertJ .
org.assertj.core.api.ListAssert.containsExactly() jest tym, czego potrzebujesz: sprawdza, czy aktualna grupa zawiera dokładnie podane wartości i nic więcej, w kolejności określonej w javadoc.
Załóżmy Fooklasę, w której dodajesz elementy i gdzie możesz to uzyskać.
Test jednostkowy, Fooktóry potwierdza, że obie listy mają taką samą zawartość, mógłby wyglądać następująco:
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");
}
Dobrą stroną AssertJ jest to, że deklarowanie a Listzgodnie z oczekiwaniami jest niepotrzebne: sprawia, że stwierdzenie jest prostsze, a kod bardziej czytelny:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Ale biblioteki Assertion / Matcher są koniecznością, ponieważ będą naprawdę dalej.
Załóżmy teraz, że Foo nie przechowuje instancji Strings ale Bars.
To bardzo powszechna potrzeba. Dzięki AssertJ twierdzenie jest nadal łatwe do napisania. Lepiej możesz stwierdzić, że zawartość listy jest równa, nawet jeśli klasa elementów nie nadpisuje, equals()/hashCode()podczas gdy sposób JUnit wymaga, aby:
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"));
}
assertArrayEqualsObecnie lubię używać . Używaj w połączeniu zList#toArray.