Mam projekt gradle i kiedy moja sekcja zależności build.gradle wygląda następująco:
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'
}
prowadzi to do tego wyjątku:
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)
Aby rozwiązać ten problem, podstawiłem „mockito-all” na „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'
}
Wyjaśnienie między mockito-all i mockito-core można znaleźć tutaj:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito -wszystkie projekty oparte na mengengradle /
mockito-all.jar oprócz samego Mockito zawiera także (od wersji 1.9.5) dwie zależności: Hamcrest i Objenesis (pomińmy na chwilę przepakowane ASM i CGLIB). Powodem było posiadanie wszystkiego, co jest potrzebne w jednym pliku JAR, aby po prostu umieścić go w ścieżce klas. Może to wyglądać dziwnie, ale pamiętaj, że rozwój Mockito rozpoczął się w czasach, gdy czysta Mrówka (bez zarządzania zależnościami) była najpopularniejszym systemem kompilacji dla projektów Java i wszystkie zewnętrzne pliki JAR wymagane przez projekt (tj. Zależności naszego projektu i ich zależności) miały do pobrania ręcznie i określone w skrypcie kompilacji.
Z drugiej strony mockito-core.jar to tylko klasy Mockito (również z ponownie zapakowanym ASM i CGLIB). Podczas korzystania z Maven lub Gradle wymagane zależności (Hamcrest i Objenesis) są zarządzane przez te narzędzia (pobierane automatycznie i uruchamiane testową ścieżką klas). Pozwala to na zastąpienie używanych wersji (na przykład, jeśli nasze projekty używają nigdy wersji kompatybilnej z poprzednimi wersjami), ale co ważniejsze, te zależności nie są ukryte w mockito-all.jar, co pozwala wykryć możliwą niezgodność wersji z narzędziami analizy zależności. Jest to znacznie lepsze rozwiązanie, gdy w projekcie używane jest narzędzie do zarządzania zależnościami.