assertEquals(Object, Object)
від JUnit4 / JUnit 5 або assertThat(actual, is(expected));
від Hamcrest, запропоновані в інших відповідях, працюватимуть лише як обидва, так equals()
і toString()
переосмислені для класів (і глибоко) порівняних об'єктів.
Це важливо, оскільки тест рівності у твердженні покладається equals()
і повідомлення про помилку тесту покладається на toString()
порівняні об'єкти.
Для вбудованих класів , таких як String
, Integer
і тому для ... без проблем , як вони перекриють як equals()
і toString()
. Тож цілком справедливо стверджувати List<String>
або List<Integer>
з assertEquals(Object,Object)
.
І з цього приводу: ви повинні перекрити equals()
клас, тому що це має сенс з точки зору рівності об'єктів, а не лише для спрощення тверджень у тесті з JUnit.
Щоб полегшити твердження, у вас є інші способи.
Як хороша практика, я віддаю перевагу бібліотекам твердження / відповідності.
Ось рішення AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
це те, що вам потрібно: він перевіряє, що фактична група містить саме задані значення і більше нічого, для того, як зазначено в javadoc.
Припустимо Foo
клас, де ви додаєте елементи і де ви можете їх отримати.
Тест на Foo
це підтверджує, що два списки мають однаковий вміст:
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");
}
Хорошим моментом AssertJ є те, що декларування List
очікуваного як очікуваного є непотрібним: це робить твердження випрямленням і код більш читабельним:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Але бібліотеки затвердження / відповідників є обов'язковими, тому що це дійсно далі.
Припустимо, зараз Foo
не зберігаються екземпляри String
s, а Bar
s.
Це дуже поширена потреба. З AssertJ твердження все ще просто написати. Краще ви можете стверджувати, що вміст списку є рівним, навіть якщо клас елементів не перекриває, equals()/hashCode()
тоді як JUnit вимагає:
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
наш час. Використовувати в поєднанні зList#toArray
.