assertEquals(Object, Object)do JUnit4 / JUnit 5 ou assertThat(actual, is(expected));do Hamcrest, proposto nas outras respostas, funcionará apenas como ambos equals()e toString()será substituído pelas classes (e profundamente) dos objetos comparados.
É importante porque o teste de igualdade na asserção se baseia equals()e a mensagem de falha de teste se baseia nos toString()objetos comparados.
Para classes integradas como String, Integere assim por diante ... não há problema, pois essas substituem ambos equals()e toString(). Portanto, é perfeitamente válido afirmar List<String>ou List<Integer>com assertEquals(Object,Object).
E sobre este assunto: você deve substituir equals()em uma classe porque faz sentido em termos de igualdade de objetos, não apenas para facilitar as afirmações em um teste com JUnit.
Para facilitar as afirmações, você tem outras maneiras.
Como prática recomendada, sou a favor das bibliotecas de asserção / correspondência.
Aqui está uma solução AssertJ .
org.assertj.core.api.ListAssert.containsExactly() é o que você precisa: verifica se o grupo real contém exatamente os valores fornecidos e nada mais, na ordem indicada no javadoc.
Suponha uma Fooclasse em que você adicione elementos e onde possa obtê-lo.
Um teste de unidade Foodisso afirma que as duas listas têm o mesmo conteúdo:
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");
}
Um ponto positivo da AssertJ é que declarar a Listcomo esperado é desnecessário: torna a afirmação mais direta e o código mais legível:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Mas as bibliotecas de asserções / correspondências são uma obrigação, porque elas realmente serão mais avançadas.
Suponha agora que Foo não armazene Strings mas Bars instâncias.
Essa é uma necessidade muito comum. Com AssertJ a asserção ainda é simples de escrever. Melhor você pode afirmar que o conteúdo da lista é igual, mesmo que a classe dos elementos não substitua equals()/hashCode()enquanto a maneira JUnit exigir que:
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"));
}
assertArrayEqualshoje em dia. Use em combinação comList#toArray.