Assert en listas ignorando el orden

Assert en Listas Java

Assert en Listas Java


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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *