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
не хранит 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
.