unit tutorial test run intellij idea hacer generate create crear como java junit intellij-idea junit4 hamcrest

java - tutorial - Obteniendo "NoSuchMethodError: org.hamcrest.Matcher.describeMismatch" al ejecutar la prueba en IntelliJ 10.5



junit intellij tutorial (10)

A pesar 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 he comprobado un valor de tipo Long.

Y esto llevó al problema.

De alguna manera, los Matchers tienen problemas con valores de tipo Long. (No uso JUnit ni Rest-Assured, por lo tanto, no sé. Exactamente por qué, pero supongo que los datos JSON devueltos solo contienen enteros).

Entonces, lo que hice para solucionar el problema fue lo siguiente. En lugar de usar:

long ID = ...; ... .then().assertThat() .body("myArray", hasItem(ID));

solo tienes que lanzar a Integer. Así que el código de trabajo se veía así:

long ID = ...; ... .then().assertThat() .body("myArray", hasItem((int) ID));

Probablemente 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.

Estoy usando JUnit-dep 4.10 y Hamcrest 1.3.RC2.

He creado un emparejador 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 comandos utilizando 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á utilizando el hamcrest.MatcherAssert incorrecto. ¿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 ruta de clase es 1.3.RC2.

¿IntelliJ IDEA utiliza su propia copia de JUnit o Hamcrest?

¿Cómo envío el CLASSPATH de tiempo de ejecución que IntelliJ está utilizando?


Asegúrese de que el tarro de hamcrest sea ​​más alto en el orden de importación que su tarro de JUnit .

JUnit viene con su propia clase org.hamcrest.Matcher que probablemente se esté utilizando en su lugar.

También puedes descargar y usar junit-dep-4.10.jar, que es JUnit sin las clases hamcrest.

mockito también incluye las clases de hamcrest, por lo que es posible que deba moverlo y reordenarlo también.


El problema era que se estaba utilizando la clase hamcrest.Matcher incorrecta, no hamcrest.MatcherAssert . Se estaba obteniendo de una dependencia junit-4.8 que estaba especificando una de mis dependencias.

Para ver qué dependencias (y versiones) se incluyen de qué fuente durante la prueba, ejecute:

mvn dependency:tree -Dscope=test


Este problema también surge cuando tiene mockito-all en su ruta de clase, que ya está en desuso.

Si es posible solo incluye mockito-core .

Maven config para mezclar junit, mockito y hamcrest:

<dependencies> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>


Esto funcionó para mí después de luchar un poco

<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>


Lo que funcionó para mí fue excluir el grupo hamcrest de la compilación de la prueba junit.

Aquí está el código de mi build.gradle:

testCompile (''junit:junit:4.11'') { exclude group: ''org.hamcrest'' }

Si está ejecutando IntelliJ, es posible que deba ejecutar la gradle cleanIdea idea clean build para volver a detectar las dependencias.


Lo siguiente debe ser el 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

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.8</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>


Sé que esa no es la mejor respuesta, pero si no puede hacer que la ruta de clase funcione, esta es una solución del plan B.

En mi ruta de clase de prueba, agregué la siguiente interfaz con una implementación predeterminada para el método describeMismatch.

package org.hamcrest; /** * PATCH because there''s something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher * implements the describeMismatch method, but it doesn''t work for me. */ public interface Matcher<T> extends SelfDescribing { boolean matches(Object item); default void describeMismatch(Object item, Description mismatchDescription) { mismatchDescription.appendDescriptionOf(this).appendValue(item); } @Deprecated void _dont_implement_Matcher___instead_extend_BaseMatcher_(); }


Sé que este es un hilo antiguo, pero lo que resolvió el problema fue agregar lo siguiente a mis archivos build.gradle. Como ya se mencionó anteriormente, hay un problema de compatibilidad con mockito-all

Posiblemente post útil:

testCompile (''junit:junit:4.12'') { exclude group: ''org.hamcrest'' } testCompile (''org.mockito:mockito-core:1.10.19'') { exclude group: ''org.hamcrest'' } testCompile ''org.hamcrest:hamcrest-core:1.3''


Tratar

expect(new ThrowableMessageMatcher(new StringContains(message)))

en lugar de

expectMessage(message)

Puede escribir una ExpectedException o un método de utilidad personalizado para envolver el código.