Eu tenho um projeto gradle e quando minha seção de dependências build.gradle se parece com isso:
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'
}
isso leva a esta exceção:
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 corrigir esse problema, substituí "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'
}
A explicação entre mockito-all e mockito-core pode ser encontrada aqui:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -todos os projetos baseados em graduação /
O mockito-all.jar além do próprio Mockito contém também (a partir do 1.9.5) duas dependências: Hamcrest e Objenesis (vamos omitir o ASM e o CGLIB reembalados por um momento). O motivo era ter tudo o que é necessário dentro de um JAR para colocá-lo em um caminho de classe. Pode parecer estranho, mas lembre-se de que o desenvolvimento do Mockito começou nos tempos em que o Ant puro (sem gerenciamento de dependências) era o sistema de construção mais popular para projetos Java e todos os JARs externos exigidos por um projeto (ou seja, as dependências do nosso projeto e suas dependências) tinham para ser baixado manualmente e especificado em um script de construção.
Por outro lado, mockito-core.jar é apenas classes Mockito (também com ASM e CGLIB reembalado). Ao usá-lo com Maven ou Gradle, as dependências necessárias (Hamcrest e Objenesis) são gerenciadas por essas ferramentas (baixadas automaticamente e colocadas em um caminho de classe de teste). Ele permite substituir as versões usadas (por exemplo, se nossos projetos usam nunca, mas a versão compatível com versões anteriores), mas o mais importante é que essas dependências não estejam ocultas no mockito-all.jar, o que permite detectar uma possível incompatibilidade de versão com as ferramentas de análise de dependência. Essa é uma solução muito melhor quando a ferramenta gerenciada por dependência é usada em um projeto.