Tengo un proyecto gradle y cuando mi sección de dependencias build.gradle se ve así:
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
testImplementation 'junit:junit:4.12'
// testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
apt 'org.projectlombok:lombok:1.18.4'
}
conduce a esta excepción:
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)
Para solucionar este problema, he sustituido "mockito-all" por "mockito-core".
dependencies {
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
// testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
testImplementation 'junit:junit:4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
compileOnly 'org.projectlombok:lombok:1.18.4'
apt 'org.projectlombok:lombok:1.18.4'
}
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 /
mockito-all.jar además de Mockito en sí contiene también (a partir de 1.9.5) dos dependencias: Hamcrest y Objenesis (omita por un momento ASM y CGLIB reempaquetados). La razón era tener todo lo que se necesita dentro de un JAR para ponerlo en un classpath. Puede parecer extraño, pero recuerde que el desarrollo de Mockito comenzó en momentos en que Ant puro (sin administración de dependencias) era el sistema de compilación más popular para proyectos Java y todos los JAR externos requeridos por un proyecto (es decir, las dependencias de nuestro proyecto y sus dependencias) tenían para descargarse manualmente y especificarse en un script de compilación.
Por otro lado, mockito-core.jar es solo clases de Mockito (también con ASM y CGLIB reempaquetados). Cuando se usa con Maven o Gradle, las dependencias requeridas (Hamcrest y Objenesis) son administradas por esas herramientas (descargadas automáticamente y puestas en un classpath de prueba). Permite anular versiones usadas (por ejemplo, si nuestros proyectos usan una versión nunca compatible, pero compatible con versiones anteriores), pero lo que es más importante esas dependencias no están ocultas dentro de mockito-all.jar, lo que permite detectar posibles incompatibilidades de versiones con herramientas de análisis de dependencia. Esta es una solución mucho mejor cuando la herramienta administrada por dependencia se utiliza en un proyecto.