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.