Getting “NoSuchMethodError: org.hamcrest.Matcher.describeMismatch” beim Ausführen von Test in IntelliJ 10.5

Ich benutze JUnit-dep 4.10 und Hamcrest 1.3.RC2.

Ich habe einen benutzerdefinierten Matcher erstellt, der wie folgt aussieht:

public static class MyMatcher extends TypeSafeMatcher { @Override protected boolean matchesSafely(String s) { /* implementation */ } @Override public void describeTo(Description description) { /* implementation */ } @Override protected void describeMismatchSafely(String item, Description mismatchDescription) { /* implementation */ } } 

Es funktioniert einwandfrei, wenn es über die Befehlszeile mit Ant ausgeführt wird. Wenn es jedoch von IntelliJ ausgeführt wird, schlägt es fehl mit:

 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) at com.netflix.build.MyTest.testmyStuff(MyTest.java:40) 

Meine Vermutung ist, dass es den falschen Hamcrest.MatcherAssert verwendet. Wie finde ich heraus, welche hanccrest.MatcherAssert-Datei verwendet wird (dh welche JAR-Datei, die für hamcrest.MatcherAssert verwendet wird)? AFAICT, das einzige Hamcrest-Glas in meinem classnpfad ist 1.3.RC2.

Verwendet IntelliJ IDEA eine eigene Kopie von JUnit oder Hamcrest?

Wie gebe ich die Laufzeit CLASSPATH aus, die IntelliJ verwendet?

   

    Stellen Sie sicher, dass das Hamcrest- Glas beim Import höher ist als Ihr JUnit- Glas.

    JUnit kommt mit einer eigenen org.hamcrest.Matcher class, die wahrscheinlich stattdessen verwendet wird.

    Sie können auch das junit -dep-4.10.jar herunterladen und verwenden, welches JUnit ohne die Hamcrest-classn ist.

    Mockito hat auch die Hamcrest-classn darin, also müssen Sie möglicherweise auch verschieben \ reorder es

    Dieses Problem tritt auch auf, wenn Sie Mockito-all auf Ihrem classnpfad haben, der bereits veraltet ist.

    Wenn möglich, schließen Sie einfach Mockito-Core ein .

    Maven Config zum Mischen von Junit, Mockito und Hamcrest:

       org.hamcrest hamcrest-core 1.3 test   org.hamcrest hamcrest-library 1.3 test   org.mockito mockito-all 1.9.5 test   junit junit 4.11 test   

    Das Problem war, dass der falsche hamcrest.Matcher , nicht hamcrest.MatcherAssert , class verwendet wurde. Das wurde aus einer Junit-4.8-Abhängigkeit gezogen, die eine meiner Abhängigkeiten spezifizierte.

    Um zu sehen, welche Abhängigkeiten (und Versionen) von welcher Quelle beim Testen enthalten sind, führen Sie Folgendes aus:

     mvn dependency:tree -Dscope=test 

    Das Folgende sollte heute am besten sein. Beachten Sie, dass Junit 4.11 von hamcrest-core abhängig ist, Sie sollten also nicht angeben müssen, dass mockito-all nicht verwendet werden kann, da es hammcrest 1.1 enthält (nicht davon abhängig ist)

      junit junit 4.11 test   org.mockito mockito-core 1.10.8 test   org.hamcrest hamcrest-core    

    Das hat nach einigem Hin und Her für mich funktioniert

      org.hamcrest hamcrest-all 1.3 test   org.mockito mockito-all 1.9.5 test   junit junit 4.11 test  

    Versuchen

    expect(new ThrowableMessageMatcher(new StringContains(message)))

    Anstatt von

    expectMessage(message)

    Sie können eine benutzerdefinierte ExpectedException oder eine benutzerdefinierte Methode zum Einschließen des Codes schreiben.

    Ich weiß, dass dies ein alter Thread ist, aber was das Problem für mich getriggers hat, war folgendes: Wie bereits oben erwähnt, gibt es ein Kompatibilitätsproblem mit mockito-all

    Möglicherweise nützlicher Beitrag :

     testCompile ('junit:junit:4.12') { exclude group: 'org.hamcrest' } testCompile ('org.mockito:mockito-core:1.10.19') { exclude group: 'org.hamcrest' } testCompile 'org.hamcrest:hamcrest-core:1.3' 

    Trotz der Tatsache, dass dies eine sehr alte Frage ist und wahrscheinlich viele der oben genannten Ideen viele Probleme getriggers haben, möchte ich immer noch die Lösung mit der Community teilen, die mein Problem behoben hat.

    Ich stellte fest, dass das Problem eine function namens “hasItem” war, die ich verwendete, um zu überprüfen, ob ein JSON-Array ein bestimmtes Element enthält. In meinem Fall habe ich nach einem Wert des Typs Long gesucht.

    Und das führte zu dem Problem.

    Irgendwie haben die Matchers Probleme mit Werten vom Typ Long. (Ich benutze JUnit oder Rest-Assured nicht so sehr IDK. Genau warum, aber ich denke, dass die zurückgegebenen JSON-Daten nur Ganzzahlen enthalten.)

    Was ich getan habe, um das Problem zu beheben, war folgendes. Anstatt zu verwenden:

     long ID = ...; ... .then().assertThat() .body("myArray", hasItem(ID)); 

    Sie müssen nur in Integer umwandeln. So sah der Arbeitscode so aus:

     long ID = ...; ... .then().assertThat() .body("myArray", hasItem((int) ID)); 

    Das ist wahrscheinlich nicht die beste Lösung, aber ich wollte nur erwähnen, dass die Ausnahme auch wegen falscher / unbekannter Datentypen ausgetriggers werden kann.

    Was für mich funktionierte, war das Ausschließen der Hamcrest-Gruppe aus dem Junit-Test-Compile.

    Hier ist der Code von meinem build.gradle:

     testCompile ('junit:junit:4.11') { exclude group: 'org.hamcrest' } 

    Wenn Sie IntelliJ gradle cleanIdea idea clean build Sie möglicherweise gradle cleanIdea idea clean build , um die Abhängigkeiten erneut zu erkennen.

    Ich weiß, dass das nicht die beste Antwort ist, aber wenn Sie den classnpfad nicht zum Laufen bringen können, ist dies eine Plan-B-Lösung.

    In meinem Testklassenpfad habe ich die folgende Schnittstelle mit einer Standardimplementierung für die Methode describeMismatch hinzugefügt.

     package org.hamcrest; /** * PATCH because there's something wrong with the classpath. Hamcrest should be higher than Mockito so that the BaseMatcher * implements the describeMismatch method, but it doesn't work for me. */ public interface Matcher extends SelfDescribing { boolean matches(Object item); default void describeMismatch(Object item, Description mismatchDescription) { mismatchDescription.appendDescriptionOf(this).appendValue(item); } @Deprecated void _dont_implement_Matcher___instead_extend_BaseMatcher_(); }