Assert en listas ignorando el orden
Cuando realizamos nuestros test en nuestras aplicaciones, en muchas ocasiones queremos realizar comparaciones de listas para asegurar que son iguales, pero en ocasiones el orden es diferente y el test falla. En esta entrada vamos a ver como podemos realizar un assert en listas ignorando el orden cuando únicamente nos importa el contenido.
Introducción
Cuando hacemos comparaciones entre listas haciendo uso de equals nos encontramos con que las listas tiene que tener los mismo elementos en el mismo orden para devolver true. Así que el método equals solo podrá ser utilizado cuando no nos importa el orden.
Por ejemplo, si realizamos el siguiente test obtendremos false, aunque nuestras listas tienen los mismos elementos
@Test public void given_two_list_when_assert_then_return_false() { List listA = Arrays.asList("Amarillo", "Rojo", "Azul", "Verde", "Gris"); List listB = Arrays.asList("Rojo", "Azul", "Verde", "Gris","Amarillo"); assertFalse(listA.equals(listB)); }
A continuación vamos a ver diferentes aproximaciones para verificar si dos listas son iguales.
Uso de Apache Commons para verificar si dos listas son iguales sin importar el orden
Aunque la librería más común al realizar test en nuestra aplicación es JUnit, Apache Commons nos ofrece el Apache CollectionUtils con lo que podemos realizar comparaciones.
Para ello lo primero es añadir la dependencia maven:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>
Y una vez tenemos la dependencia hacemos uso de CollectionUtils.isEqualCollection con lo que podemos realizar comparaciones de listas sin importar el orden.
@Test public void given_two_list_when_assert_with_apache_commons_then_return_true() { List listA = Arrays.asList("Amarillo", "Rojo", "Azul", "Verde", "Gris"); List listB = Arrays.asList("Rojo", "Azul", "Verde", "Gris","Amarillo"); assertTrue(CollectionUtils.isEqualCollection(listA, listB)); }
Assert en listas ignorando el orden con JUnit
JUnit es la librería por excelencia para realizar testing y poder realizar assert en nuestras aplicaciones. JUnit no nos ofrece una manera tan directa como CollectionUtils de Apache Commons, pero podemos hacer uso del método containsAll de Java.
@Test public void given_two_list_when_assert_with_junit_then_return_true() { List listA = Arrays.asList("Amarillo", "Rojo", "Azul", "Verde", "Gris"); List listB = Arrays.asList("Rojo", "Azul", "Verde", "Gris", "Amarillo"); assertTrue( listA.size() == listB.size() && listA.containsAll(listB) && listB.containsAll(listA)); }
Uso de Hamcrest para realizar assert en listas ignorando el orden
Otra de las opciones para realizar testing en nuestra aplicaciones es hacer uso Hamcrest. Para ello lo primero es añadir su dependencia en nuestro pom.xml de la aplicación:
<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest</artifactId> <version>2.2</version> <scope>test</scope> </dependency>
Una vez tenemos la dependencia añadida en nuestra aplicación podemos hacer uso del método de Hamcrest Matchers.containsInAnyOrder
@Test public void given_two_list_when_assert_with_hamcrest_then_return_true() { List listA = Arrays.asList("Amarillo", "Rojo", "Azul", "Verde", "Gris"); List listB = Arrays.asList("Rojo", "Azul", "Verde", "Gris", "Amarillo"); assertThat(listA, Matchers.containsInAnyOrder(listB.toArray())); }
Assert en testing con AssertJ
Finalmente, si en nuestros test hacemos uso de AssertJ, para realizar aserciones en Java podemos hacer uso del método hasSameElementsAs, para verificar si tenemos los mismos elementos.
La dependencia sería:
<dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.24.2</version> </dependency>
Una vez metemos la dependencia podemos hacer uso de hasSameElementsAs:
@Test public void given_two_list_when_assert_with_assertj_then_return_true() { List listA = Arrays.asList("Amarillo", "Rojo", "Azul", "Verde", "Gris"); List listB = Arrays.asList("Rojo", "Azul", "Verde", "Gris", "Amarillo"); assertThat(listA).hasSameElementsAs(listB); }
Conclusión
En esta entrada hemos visto como realizar Assert en listas ignorando el orden que será de gran utilidad en nuestros test.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!