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
, Integer
i 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 Foo
klasę, w której dodajesz elementy i gdzie możesz to uzyskać.
Test jednostkowy, Foo
któ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 List
zgodnie 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 String
s ale Bar
s.
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"));
}
assertArrayEquals
Obecnie lubię używać . Używaj w połączeniu zList#toArray
.