recorrer que obtener linkedlist español elemento ejemplo java unit-testing junit4 hamcrest

java - obtener - ¿Cómo afirmo que un Iterable contiene elementos con una cierta propiedad?



recorrer arraylist java foreach (5)

Gracias @Razvan quien me apuntó en la dirección correcta. Pude conseguirlo en una línea y cacé con éxito las importaciones de Hamcrest 1.3.

las importaciones:

import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.contains; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;

el código:

assertThat( myClass.getMyItems(), contains( hasProperty("name", is("foo")), hasProperty("name", is("bar")) ));

Supongamos que quiero probar un método unitario con esta firma:

List<MyItem> getMyItems();

Asumir que MyItem es un Pojo que tiene muchas propiedades, una de las cuales es "name" , a la que se accede a través de getName() .

Lo único que me importa verificar es que List<MyItem> , o cualquier Iterable , contiene dos instancias de MyItem , cuyas propiedades de "name" tienen los valores "foo" y "bar" . Si otras propiedades no coinciden, realmente no me importan los propósitos de esta prueba. Si los nombres coinciden, es una prueba exitosa.

Me gustaría que sea de una sola línea si es posible. Aquí hay alguna "pseudo-sintaxis" del tipo de cosas que me gustaría hacer.

assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});

¿Hamcrest sería bueno para este tipo de cosas? Si es así, ¿cuál sería exactamente la versión de Hamcrest de mi pseudo-sintaxis anterior?


No es especialmente Hamcrest, pero creo que vale la pena mencionarlo aquí. Lo que uso bastante a menudo en Java8 es algo así como:

assertTrue(myClass.getMyItems().stream().anyMatch(item -> "foo".equals(item.getName())));

(Editado a la ligera mejoría de Rodrigo Manyari. Es un poco menos detallado. Ver comentarios).

Puede ser un poco más difícil de leer, pero me gusta el tipo y la seguridad de refactorización. También es bueno para probar múltiples propiedades de frijol en combinación. por ejemplo, con una expresión && java en el filtro lambda.


Siempre que su Lista sea una clase concreta, simplemente puede llamar al método contains () siempre que haya implementado su método equals () en MyItem.

// given // some input ... you to complete // when List<MyItems> results = service.getMyItems(); // then assertTrue(results.contains(new MyItem("foo"))); assertTrue(results.contains(new MyItem("bar")));

Supone que ha implementado un constructor que acepta los valores que desea afirmar. Me doy cuenta de que esto no está en una sola línea, pero es útil saber qué valor falta en lugar de verificar ambos a la vez.


Tratar:

assertThat(myClass.getMyItems(), hasItem(hasProperty("YourProperty", is("YourValue"))));


Assertj es bueno en esto.

import static org.assertj.core.api.Assertions.assertThat; assertThat(myClass.getMyItems()).extracting("name").contains("foo", "bar");

Una gran ventaja para assertj en comparación con Hamcrest es el uso fácil de completar el código.