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, Integery 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 Fooclase donde agrega elementos y donde puede obtenerlos.
Una prueba unitaria de Fooeso 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 Listcomo 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 Strings sino Bars 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"));
}
assertArrayEqualshoy en día. Usar en combinación conList#toArray.