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");
Но библиотеки Assertion / matcher являются обязательными, потому что они действительно будут дальше.
Предположим теперь, что Foo не хранит Strings, а Bars экземпляров.
Это очень распространенная потребность. С 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.