¿Cómo puedo hacer una afirmación de igualdad entre listas en un caso de prueba JUnit ? La igualdad debe estar entre el contenido de la lista.
Por ejemplo:
List<String> numbers = Arrays.asList("one", "two", "three");
List<String> numbers2 = Arrays.asList("one", "two", "three");
List<String> numbers3 = Arrays.asList("one", "two", "four");
// numbers should be equal to numbers2
//numbers should not be equal to numbers3
java
unit-testing
collections
junit
Kamal
fuente
fuente
assertArrayEquals
hoy en día. Usar en combinación conList#toArray
.assertArrayEquals
requiere que obtengas matrices de tus listas. Puede operar directamente en la lista usandoassertIterableEquals
assertIterableEquals
disponible para jUnit5 @ThetaSinnerRespuestas:
Me doy cuenta de que esto se hizo hace un par de años, probablemente esta característica no estaba disponible entonces. Pero ahora, es fácil hacer esto:
Si tiene una versión reciente de Junit instalada con Hamcrest, simplemente agregue estas importaciones:
http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T, org.hamcrest.Matcher)
http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html
fuente
System.out.println(actual == expected);
devolverá falso, peroSystem.out.println(actual.equals(expected));
devolverá verdadero..equals(..)
lugar de==
?No se transforme en una cadena y compare. Esto no es bueno para el rendimiento. En el junit, dentro de Corematchers, hay una coincidencia para esto =>
hasItems
Esta es la mejor manera que conozco para verificar elementos en una lista.
fuente
Assert.assertEquals(4,yourList.size());
assertThat(yourList.toArray(), arrayContainingInAnyOrder(1,2,3,4,5));
toString()
versión no es la mejor manera.Esta es una respuesta heredada, adecuada para JUnit 4.3 y versiones posteriores. La versión moderna de JUnit incluye mensajes de falla legibles integrados en el método afirmar ese. Prefiere otras respuestas a esta pregunta, si es posible.
Para el registro, como @Paul mencionó en su comentario a esta respuesta, dos
List
s son iguales:Vea los JavaDocs de la
List
interfaz .fuente
assertEquals(Object, Object)
de JUnit4 / JUnit 5 oassertThat(actual, is(expected));
de Hamcrest propuesto en las otras respuestas funcionarán solo como ambosequals()
ytoString()
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 entoString()
los objetos comparados.Para clases integradas como
String
,Integer
y así para ... no hay problema, ya que anulan ambasequals()
ytoString()
. Por lo tanto, es perfectamente válido afirmarList<String>
oList<Integer>
conassertEquals(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í: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:Pero las bibliotecas Assertion / matcher son imprescindibles porque estas realmente irán más allá.
Supongamos ahora que
Foo
no almacenaString
s sinoBar
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:fuente
Si no le importa el orden de los elementos, lo recomiendo
ListAssert.assertEquals
en junit-addons.Enlace: http://junit-addons.sourceforge.net/
Para usuarios perezosos de Maven:
fuente
Puede usar afirmarEquals en junit.
Si el orden de los elementos es diferente, devolverá un error.
fuente
si no desea crear una lista de matriz, puede probar esto también
fuente
fuente
¡No reinventes la rueda!
Hay una biblioteca de códigos de Google que hace esto por usted: Hamcrest
fuente
Sé que ya hay muchas opciones para resolver este problema, pero preferiría hacer lo siguiente para afirmar dos listas en cualquier orden :
fuente
assertEquals(expected, result);
funciona para mi. Como esta función obtiene dos objetos, puede pasarle cualquier cosa.fuente
No sé esto, todas las respuestas anteriores están dando la solución exacta para comparar dos listas de objetos. La mayoría de los enfoques anteriores pueden ser útiles solo para el siguiente límite de comparaciones - Comparación de tamaño - Comparación de referencia
Pero si tenemos listas de objetos del mismo tamaño y datos diferentes en el nivel de los objetos, estos enfoques de comparación no ayudarán.
Creo que el siguiente enfoque funcionará perfectamente con la anulación de los métodos igual y hashcode en el objeto definido por el usuario.
Utilicé Xstream lib para anular equals y hashcode, pero también podemos anular equals y hashcode sin la lógica / comparación ganada.
Aquí está el ejemplo para su referencia.
Lo más importante es que puede ignorar los campos por Anotación (@XStreamOmitField) si no desea incluir ningún campo en la verificación igual de Objetos. Hay muchas anotaciones como esta para configurar, así que eche un vistazo a las anotaciones de esta lib.
Estoy seguro de que esta respuesta le ahorrará tiempo para identificar el enfoque correcto para comparar dos listas de objetos :). Comenta si ves algún problema al respecto.
fuente