Estoy usando JUnit-dep 4.10 y Hamcrest 1.3.RC2.
He creado un matizador personalizado que se parece a lo siguiente:
public static class MyMatcher extends TypeSafeMatcher<String> {
@Override
protected boolean matchesSafely(String s) {
/* implementation */
}
@Override
public void describeTo(Description description) {
/* implementation */
}
@Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
/* implementation */
}
}
Funciona perfectamente bien cuando se ejecuta desde la línea de comando usando Ant. Pero cuando se ejecuta desde IntelliJ, falla con:
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.netflix.build.MyTest.testmyStuff(MyTest.java:40)
Mi conjetura es que está usando el hamcrest incorrecto. MatcherAssert. ¿Cómo encuentro qué hamcrest.MatcherAssert está usando (es decir, qué archivo jar está usando para hamcrest.MatcherAssert)? AFAICT, los únicos tarros de Hamcrest en mi classpath son 1.3.RC2.
¿IntelliJ IDEA usa su propia copia de JUnit o Hamcrest?
¿Cómo envío el CLASSPATH en tiempo de ejecución que IntelliJ está usando?
Este problema también surge cuando tienes mockito-all en tu ruta de clase, que ya está en desuso.
Si es posible, solo incluya mockito-core .
Configuración de Maven para mezclar junit, mockito y hamcrest:
fuente
El problema era que se estaba usando la clase incorrecta
hamcrest.Matcher
, nohamcrest.MatcherAssert
. Eso estaba siendo extraído de una dependencia junit-4.8 que una de mis dependencias estaba especificando.Para ver qué dependencias (y versiones) se incluyen de qué fuente durante la prueba, ejecute:
fuente
-all
con-core
, etc.): tuve que cambiar Hamcrest a la versión 1.1 y ahora todo funciona de nuevo.import static org.mockito.Matchers.anyString;
deimport static org.mockito.ArgumentMatchers.anyString;
Lo siguiente debería ser lo más correcto hoy. Tenga en cuenta que junit 4.11 depende de hamcrest-core, por lo que no debería necesitar especificar que no se puede usar mockito-all ya que incluye (no depende de) hamcrest 1.1
fuente
mockito-all
me ayudó, nomockito-core
. También declarando Hamcrest ante Mockito enpom.xml
obras.Esto funcionó para mí después de luchar un poco
fuente
Tratar
expect(new ThrowableMessageMatcher(new StringContains(message)))
en vez de
expectMessage(message)
Puede escribir un
ExpectedException
método personalizado o de utilidad para envolver el código.fuente
Sé que este es un hilo antiguo, pero lo que resolvió el problema para mí fue agregar lo siguiente a mis archivos build.gradle. Como ya se indicó anteriormente, hay un problema de compatibilidad con
mockito-all
Posible publicación útil :
fuente
A pesar del hecho de que esta es una pregunta muy antigua y probablemente muchas de las ideas antes mencionadas resolvieron muchos problemas, todavía quiero compartir la solución con la comunidad que solucionó mi problema.
Descubrí que el problema era una función llamada "hasItem" que estaba usando para verificar si un JSON-Array contiene o no un elemento específico. En mi caso, verifiqué un valor de tipo Long.
Y esto condujo al problema.
De alguna manera, los Matchers tienen problemas con los valores de tipo Long. (No uso JUnit o Rest-Assured tanto, idk. Exactamente por qué, pero supongo que los datos JSON devueltos solo contienen números enteros).
Entonces, lo que hice para solucionar el problema fue lo siguiente. En lugar de usar:
solo tienes que lanzar a Integer. Entonces el código de trabajo se veía así:
Probablemente esa no sea la mejor solución, pero solo quería mencionar que la excepción también se puede lanzar debido a tipos de datos incorrectos / desconocidos.
fuente
Lo que funcionó para mí fue excluir al grupo de Hamcrest de la compilación de prueba junit.
Aquí está el código de mi build.gradle:
Si está ejecutando IntelliJ, es posible que deba ejecutar
gradle cleanIdea idea clean build
para detectar las dependencias nuevamente.fuente
Sé que esa no es la mejor respuesta, pero si no puede hacer que el classpath funcione, esta es una solución del plan B.
En mi classpath de prueba, agregué la siguiente interfaz con una implementación predeterminada para el método describeMismatch.
fuente
Tengo un proyecto gradle y cuando mi sección de dependencias build.gradle se ve así:
conduce a esta excepción:
Para solucionar este problema, he sustituido "mockito-all" por "mockito-core".
La explicación entre mockito-all y mockito-core se puede encontrar aquí: https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -todos-en-mavengradle-based-projects /
fuente
En mi caso, tuve que excluir una hamaca más antigua de junit-vintage:
fuente
Esto funcionó para mí. No es necesario excluir nada. Acabo de utilizar
mockito-core
en su lugarmockito-all
fuente