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
, Integer
e 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 Foo
classe em que você adicione elementos e onde possa obtê-lo.
Um teste de unidade Foo
disso 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 List
como 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 String
s mas Bar
s 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"));
}
assertArrayEquals
hoje em dia. Use em combinação comList#toArray
.