J'ai un projet gradle et quand ma section dépendances de 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 y mockito-core peuvent être trouvés ici : https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito-all-in-mavengradle-based-projects/
mockito-all.jar en plus de Mockito lui-même contient également (à partir de 1.9.5) deux dépendances : Hamcrest et Objenesis (omettons pour l'instant ASM et CGLIB repackagés). CGLIB pour un moment). La raison était d'avoir tout ce qui est nécessaire à l'intérieur d'un seul JAR pour le mettre simplement dans le classpath. Cela peut sembler étrange, mais rappelez-vous que le développement de Mockito a commencé à une époque où Ant pur (sans gestion des dépendances) était le système de construction le plus populaire. pour les projets Java et tous les JARs externes requis par un projet (i.e. notre projet). projet (c'est-à-dire les dépendances de notre projet et leurs dépendances) devaient être téléchargés manuellement et spécifiés dans un build script.
D'autre part, mockito-core.jar n'est que des classes de Mockito (avec également ASM et CGLIB repackagés). Lorsque vous l'utilisez avec Maven ou Gradle, les dépendances dépendances requises (Hamcrest et Objenesis) sont gérées par ces outils (téléchargées automatiquement et placées dans un test). (téléchargées automatiquement et placées sur un classpath de test). Il permet de de remplacer les versions utilisées (par exemple si nos projets n'utilisent jamais, mais mais rétrocompatible), mais ce qui est le plus important c'est que ces dépendances ne sont pas cachées à l'intérieur de mockito-all.jar ce qui permet de détecter une éventuelle incompatibilité de version avec des outils d'analyse des dépendances. de dépendance. C'est une bien meilleure solution lorsque l'outil de gestion des dépendances est utilisé dans un projet.