Ich habe ein Gradle-Projekt und wenn mein Abschnitt build.gradle-Abhängigkeiten so aussieht:
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'
}
es führt zu dieser Ausnahme:
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)
Um dieses Problem zu beheben, habe ich "mockito-all" durch "mockito-core" ersetzt.
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'
}
Die Erklärung zwischen mockito-all und mockito-core finden Sie hier:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -all-in-mavengradle-basierte-Projekte /
mockito-all.jar enthält neben Mockito selbst (ab 1.9.5) zwei Abhängigkeiten: Hamcrest und Objenesis (lassen Sie neu verpacktes ASM und CGLIB für einen Moment weg). Der Grund war, alles, was benötigt wird, in einem JAR zu haben, um es einfach auf einen Klassenpfad zu stellen. Es kann seltsam aussehen, aber bitte denken Sie daran, dass die Mockito-Entwicklung in Zeiten begann, in denen reines Ant (ohne Abhängigkeitsmanagement) das beliebteste Build-System für Java-Projekte war und alle externen JARs, die für ein Projekt erforderlich sind (dh die Abhängigkeiten unseres Projekts und ihre Abhängigkeiten) manuell heruntergeladen und in einem Build-Skript angegeben werden.
Auf der anderen Seite ist mockito-core.jar nur eine Mockito-Klasse (auch mit neu verpacktem ASM und CGLIB). Bei Verwendung mit Maven oder Gradle werden die erforderlichen Abhängigkeiten (Hamcrest und Objenesis) von diesen Tools verwaltet (automatisch heruntergeladen und in einen Testklassenpfad gestellt). Es ermöglicht das Überschreiben verwendeter Versionen (z. B. wenn unsere Projekte nie, sondern abwärtskompatible Versionen verwenden), aber was noch wichtiger ist, diese Abhängigkeiten sind nicht in mockito-all.jar verborgen, wodurch mögliche Versionsinkompatibilitäten mit Tools zur Abhängigkeitsanalyse erkannt werden können. Dies ist eine viel bessere Lösung, wenn das abhängigkeitsverwaltete Tool in einem Projekt verwendet wird.