J'ai un projet gradle et lorsque ma section de dépendances build.gradle ressemble à ceci:
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'
}
cela conduit à cette exception:
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)
pour résoudre ce problème, j'ai remplacé "mockito-all" par "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'
}
L'explication entre mockito-all et mockito-core peut être trouvée ici:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -tous les projets basés sur Mavengradle /
mockito-all.jar en plus de Mockito lui-même contient également (à partir de 1.9.5) deux dépendances: Hamcrest et Objenesis (omettons ASM et CGLIB reconditionnés pendant un moment). La raison était d'avoir tout ce dont on avait besoin dans un seul JAR pour le mettre sur un chemin de classe. Cela peut sembler étrange, mais n'oubliez pas que le développement de Mockito a commencé à une époque où Pure Ant (sans gestion des dépendances) était le système de construction le plus populaire pour les projets Java et tous les JAR externes requis par un projet (c'est-à-dire les dépendances de notre projet et leurs dépendances). à télécharger manuellement et à spécifier dans un script de construction.
D'un autre côté, mockito-core.jar n'est que des classes Mockito (également avec ASM et CGLIB reconditionnés). Lorsque vous l'utilisez avec Maven ou Gradle, les dépendances requises (Hamcrest et Objenesis) sont gérées par ces outils (téléchargées automatiquement et placées sur un chemin de classe de test). Il permet de remplacer les versions utilisées (par exemple si nos projets utilisent jamais, mais une version rétrocompatible), mais ce qui est plus important, ces dépendances ne sont pas cachées dans mockito-all.jar ce qui permet de détecter une éventuelle incompatibilité de version avec les outils d'analyse de dépendance. C'est une bien meilleure solution lorsque l'outil de gestion des dépendances est utilisé dans un projet.