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 debo escribirlo?
containsInAnyOrder
requiere que todos los elementos estén presentes, por lo que la primera afirmación fallará. VeahasItems
si desea verificar que al menos esos elementos estén presentes.actual.getList()
contiene"item1", "item3", "item2"
, la prueba pasará y tal vez desee asegurarse de que solo contenga los elementos enumerados ... En ese caso, podría usarassertThat(actual.getList().size(), equalTo(2));
antes de containsInAnyOrder, de esta manera se asegura de que ambas listas tengan el mismo contenido.hasItems
. El cheque adicional no es necesario aquí. Vea el comentario a Tim arriba, y también ¿En qué se diferencian hasItems, contains y containsInAnyOrder de Hamcrest?*expectedList.toTypedArray()
) al pasar una matriz como varargs!Versión más corta de la respuesta de @ Joe sin parámetros redundantes.
fuente
Para complementar la respuesta de @ Joe:
Hamcrest le proporciona tres métodos principales para hacer coincidir una lista:
contains
Comprueba la coincidencia de todos los elementos tomando en cuenta el orden, si la lista tiene más o menos elementos, fallarácontainsInAnyOrder
Comprueba que coincidan todos los elementos y no importa el orden, si la lista tiene más o menos elementos, fallaráhasItems
Comprueba solo los objetos especificados, no importa si la lista tiene máshasItem
Comprueba solo un objeto, no importa si la lista tiene másTodos ellos pueden recibir una lista de objetos y usar el
equals
método de comparación o se pueden mezclar con otros comparadores como @borjab mencionado: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 ...)
fuente
Con las bibliotecas de Hamcrest existentes (a partir de la versión 2.0.0.0), está obligado a usar el método Collection.toArray () en su colección para usar containsInAnyOrder Matcher. Mucho mejor sería agregar esto como un método separado a org.hamcrest.Matchers:
En realidad, terminé agregando este método a mi biblioteca de prueba personalizada y lo usé para aumentar la legibilidad de mis casos de prueba (debido a la menor verbosidad).
fuente
Asegúrese de que las
Object
s de su lista se hayanequals()
definido. Luegotrabajos.
fuente
Para obtener una lista de objetos, es posible que necesite algo como esto:
Use containsInAnyOrder si no desea verificar el orden de los objetos.
PD Cualquier ayuda para evitar la advertencia que se suprime será muy apreciada.
fuente
Para comparar dos listas con el orden de uso conservado,
fuente
actualList
contiene los elementos dentro delcontains
matcher, que fallará si los elementos no están en el mismo orden y fallará también si contiene más elementos o falta uno.