org matchers equalto corematchers containsstring assertequals java junit hamcrest

java - equalto - import static org hamcrest corematchers containsstring



Hamcrest comparar colecciones (7)

Asegúrese de que los Object s en su lista tengan equals() definido en ellos. Entonces

assertThat(generatedList,is(equalTo(expectedList)));

trabajos.

Estoy tratando de comparar 2 listas:

assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));

Pero idea

java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>) method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>) method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable (cannot instantiate from arguments because actual and formal argument lists differ in length)

¿Cómo debería escribirlo?


Con las bibliotecas de Hamcrest existentes (a partir de la versión 2.0.0.0), se le obliga a utilizar el método Collection.toArray () en su Colección para utilizar containsInAnyOrder Matcher. Mucho mejor sería agregar esto como un método separado para org.hamcrest.Matchers:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(Collection<T> items) { return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder((T[]) items.toArray()); }

De hecho, terminé agregando este método a mi biblioteca de prueba personalizada y lo uso para aumentar la legibilidad de mis casos de prueba (debido a la menor verborrea).


Lo único que quiero agregar a la respuesta de @ Joe es que el parámetro toArray() es redundante aquí, por lo que puede escribir una comparación insensible a la orden de la siguiente manera:

List<Long> actual = Arrays.asList(1L, 2L); List<Long> expected = Arrays.asList(2L, 1L); assertThat(actual, containsInAnyOrder(expected.toArray()));


Para comparar dos listas con el orden de uso preservado,

assertThat(actualList, contains("item1","item2"));


Para complementar la respuesta de @ Joe:

Hamcrest le proporciona tres métodos principales para que coincida con una lista:

contains comprobaciones para hacer coincidir todos los elementos que toman en cuenta el orden, si la lista tiene más o menos elementos, fallará

containsInAnyOrder Checks para hacer coincidir todos los elementos y no importa el orden, si la lista tiene más o menos elementos, fallará

hasItems Checks solo para los objetos especificados, no importa si la lista tiene más

hasItem Checks solo para un objeto, no importa si la lista tiene más

Todos ellos pueden recibir una lista de objetos y usar el método de equals para la comparación o pueden mezclarse con otros evaluadores como @borjab mencionado:

assertThat(myList , contains(allOf(hasProperty("id", is(7L)), hasProperty("name", is("testName1")), hasProperty("description", is("testDesc1"))), allOf(hasProperty("id", is(11L)), hasProperty("name", is("testName2")), hasProperty("description", is("testDesc2")))));

http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains(E...) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#containsInAnyOrder(java.util.Collection) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#hasItems(T...)


Para la lista de objetos, puede necesitar algo como esto:

import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; import static org.hamcrest.Matchers.is; @Test @SuppressWarnings("unchecked") public void test_returnsList(){ arrange(); List<MyBean> myList = act(); assertThat(myList , contains(allOf(hasProperty("id", is(7L)), hasProperty("name", is("testName1")), hasProperty("description", is("testDesc1"))), allOf(hasProperty("id", is(11L)), hasProperty("name", is("testName2")), hasProperty("description", is("testDesc2"))))); }

Use containsInAnyOrder si no desea verificar el orden de los objetos.

PD: se apreciará cualquier ayuda para evitar la advertencia que se suprime.


Si quiere afirmar que las dos listas son idénticas, no complique las cosas con Hamcrest:

assertEquals(expectedList, actual.getList());

Si realmente desea realizar una comparación insensible a la orden, puede llamar al método varargs containsInAnyOrder y proporcionar valores directamente:

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(Suponiendo que su lista sea de String , en lugar de Agent , para este ejemplo).

Si realmente desea llamar a ese mismo método con los contenidos de una List :

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

Sin esto, llama al método con un único argumento y crea un Matcher que espera hacer coincidir un Iterable donde cada elemento es una List . Esto no se puede usar para hacer coincidir una List .

Es decir, no puede hacer coincidir un List<Agent> con un Matcher<Iterable<List<Agent>> , que es lo que intenta su código.