java - equalto - hamcrest matchers example
Java Hamcrest: la colección contiene un elemento de tipo (7)
Desde http://code.google.com/p/hamcrest/source/browse/trunk/hamcrest-java/hamcrest-core/src/main/java/org/hamcrest/MatcherAssert.java la firma es
assertThat(T actual, Matcher<? super T> matcher)
por lo tanto, el problema es que su emparejador es un Matcher<TestAchievement>
, no un emparejador que funcione para cualquier instancia de una súper clase o una interfaz de logros.
Parece que el emparejador de instanceOf
solo tiene un tipo de buggy enlazado. Puedes solucionar ese error haciendo algo como
@SuppressWarnings("unchecked")
Matcher/*no_param*/ isATestAchievement = instanceOf(TestAchievement.class);
assertThat(..., isATestAchievement);
Me gustaría afirmar que la List<Achievement>
contiene un miembro del tipo TestAchievement
.
Aquí está mi afirmación:
List<Achievement> achievements; // Populated elsewhere
assertThat(achievements,hasItem(isA(TestAchievement.class)));
Esto no se compila, reportando el error:
El método assertThat (T, Matcher) en el tipo Assert no es aplicable para los argumentos (List, Matcher <Iterable <TestAchievement>>)
¿Cuál es la sintaxis correcta para este tipo de aserción utilizando Hamcrest?
En realidad, no funciona para un Matcher un poco más complejo, incluso con el último lanzamiento.
assertThat(result.getAnswers(),
Matchers.hasItem(Matchers.hasProperty("content")));
No funcionará, obtendrás un:
El método assertThat (T, Matcher) en el tipo Assert no es aplicable para los argumentos (Set, Matcher>)
Puedes resolverlo convirtiéndolo en una matriz:
assertThat(result.getAnswers().toArray(), hasItemInArray(Matchers.hasProperty("content", equalTo("<h4>new comment</h4>"))));
Gracias por toda la ayuda.
Las publicaciones aquí sugirieron que era un defecto con Hamcrest, así que me dirigí al sitio de hacmrest para registrar un error, cuando descubrí que la declaración de dependencia de mvn / hiedra que estaba usando estaba obsoleta, dándome una versión antigua de Hamcrest.
Este error existe con 1.1, que es el último si se declara usando
<dependency org="org.hamcrest" name="hamcrest-all" rev="1.1">
Sin embargo, la declaración de dependencia correcta es:
<dependency org="org.hamcrest" name="hamcrest-library" rev="1.3.RC2"/>
Actualización a este resuelto el problema. La sintaxis utilizada en mi prueba es:
assertThat(achievements, hasItem(isA(TestAchievement.class)));
Hay un bug en Java 6 que se relaciona con esto.
Este código lanzará varios errores como "no se puede encontrar el símbolo ..."
assertThat(achievements, hasItem(isA(TestAchievement.class)));
La solución para esto es declarar el comparador como una variable y luego hacer referencia a esa variable. Es importante tener en cuenta que el tipo de variable, específicamente la sección de genéricos, es muy importante para que esto funcione.
Matcher<Iterable<? super TestAchievement>> matcher = hasItem(isA(TestAchievement.class));
assertThat(achievements, matcher);
Curiosamente, si usa instanceOf()
lugar de isA()
, nuevamente se encuentra con el problema. (aunque si ignora las advertencias, esto podría funcionar para usted de todos modos). Ampliando la solución anterior, puede usar:
Matcher<TestAchievement> itemMatcher = Matchers.instanceOf(TestAchievement.class);
Matcher<Iterable<? super TestAchievement>> matcher = hasItem(itemMatcher);
assertThat(achievements, matcher);
He estado divirtiéndome con esto por un tiempo, y parece que la única forma que conozco es convertir la List<Achievement>
en la List<Object>
. El problema es CoreMatchers.instanceOf()
devuelve Matcher<Object>
.
Con esa modificación, puedo hacer que esto funcione:
List<Object> achievements = new ArrayList<Object>();
achievements.add(new Achievement());
achievements.add(new TestAchievement());
assertThat(achievements, hasItem(instanceOf(TestAchievement.class)));
He estado luchando con esto por un tiempo, ninguno de los enfoques aquí realmente tuvo el resultado esperado. Por pura desesperación, intenté convertir a una matriz para ver si eso marcaba una diferencia:
List<Object> listOfThings = (List) someService.findThings(); // your business logic here
Object[] arrayOfThings = listOfThings.toArray(new Object[listOfThings.size()]);
assertThat(arrayOfThings, hasItemInArray(instanceOf(SpecialThing.class)));
Y sí hizo una diferencia. Ahora mi prueba funciona a la perfección. La única línea de copiar a la matriz parece ser una compensación razonable para evitar muchos problemas.
assertThat(achievements, hasItem(
IsInstanceOf.<Achievement>instanceOf(TestAchievement.class)));