assertEquals(Object, Object)
de JUnit4 / JUnit 5 o assertThat(actual, is(expected));
de Hamcrest propuesto en las otras respuestas funcionarán solo como ambos equals()
y toString()
se anulan para las clases (y profundamente) de los objetos comparados.
Es importante porque la prueba de igualdad en la afirmación se basa equals()
y el mensaje de falla de prueba se basa en toString()
los objetos comparados.
Para clases integradas como String
, Integer
y así para ... no hay problema, ya que anulan ambas equals()
y toString()
. Por lo tanto, es perfectamente válido afirmar List<String>
o List<Integer>
con assertEquals(Object,Object)
.
Y sobre este asunto: debe anular equals()
en una clase porque tiene sentido en términos de igualdad de objetos, no solo para facilitar las afirmaciones en una prueba con JUnit.
Para hacer las afirmaciones más fáciles, tienes otras formas.
Como buena práctica, estoy a favor de las bibliotecas de aserción / comparación.
Aquí hay una solución AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
es lo que necesita: verifica que el grupo real contenga exactamente los valores dados y nada más, en el orden indicado en el javadoc.
Suponga una Foo
clase donde agrega elementos y donde puede obtenerlos.
Una prueba unitaria de Foo
eso afirma que las dos listas tienen el mismo contenido podría verse así:
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");
}
Un buen punto de AssertJ es que declarar un List
como se espera no es necesario: hace que la afirmación sea más recta y el código sea más legible:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Pero las bibliotecas Assertion / matcher son imprescindibles porque estas realmente irán más allá.
Supongamos ahora que Foo
no almacena String
s sino Bar
s instancias.
Esa es una necesidad muy común. Con AssertJ, la afirmación sigue siendo simple de escribir. Mejor puede afirmar que el contenido de la lista es igual incluso si la clase de los elementos no se anula, equals()/hashCode()
mientras que JUnit requiere 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
hoy en día. Usar en combinación conList#toArray
.