Ho un progetto gradle e quando la mia sezione delle dipendenze build.gradle appare così:
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'
}
porta a questa eccezione:
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)
per risolvere questo problema, ho sostituito "mockito-all" con "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 spiegazione tra mockito-all e mockito-core è disponibile qui:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito progetti -all-in-mavengradle-Based-/
mockito-all.jar oltre a Mockito stesso contiene anche (a partire dalla 1.9.5) due dipendenze: Hamcrest e Objenesis (omettiamo per un momento di riconfezionare ASM e CGLIB). Il motivo era di avere tutto ciò che è necessario all'interno di un unico JAR per inserirlo in un percorso di classe. Può sembrare strano, ma ricorda che lo sviluppo di Mockito è iniziato in tempi in cui la formica pura (senza gestione delle dipendenze) era il sistema di build più popolare per i progetti Java e tutti i JAR esterni richiesti da un progetto (ovvero le dipendenze del nostro progetto e le loro dipendenze) avevano per essere scaricato manualmente e specificato in uno script di build.
D'altra parte mockito-core.jar sono solo classi Mockito (anche con ASM e CGLIB riconfezionati). Quando lo si utilizza con Maven o Gradle le dipendenze richieste (Hamcrest e Objenesis) sono gestite da quegli strumenti (scaricati automaticamente e inseriti in un percorso di classe di test). Permette di sovrascrivere le versioni usate (ad esempio se i nostri progetti utilizzano mai, ma versioni compatibili con le versioni precedenti), ma ciò che è più importante quelle dipendenze non sono nascoste all'interno di mockito-all.jar ciò che consente di rilevare possibili incompatibilità di versione con strumenti di analisi delle dipendenze. Questa è una soluzione molto migliore quando viene utilizzato lo strumento di gestione delle dipendenze in un progetto.