Ich verwende 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<String> {
@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)
Ich vermute, dass es das falsche hamcrest.MatcherAssert verwendet. Wie finde ich, welches hamcrest.MatcherAssert verwendet wird (dh welche JAR-Datei für hamcrest.MatcherAssert verwendet wird)? AFAICT, das einzige Hamcrest-Glas in meinem Klassenpfad ist 1.3.RC2.
Verwendet IntelliJ IDEA eine eigene Kopie von JUnit oder Hamcrest?
Wie gebe ich den von IntelliJ verwendeten Laufzeit-CLASSPATH aus?
Dieses Problem tritt auch auf, wenn Sie Mockito-All auf Ihrem Klassenpfad haben, der bereits veraltet ist.
Wenn möglich, einfach Mockito-Core einschließen .
Maven-Konfiguration zum Mischen von Junit, Mockito und Hamcrest:
quelle
Das Problem war , dass die falsche
hamcrest.Matcher
, nichthamcrest.MatcherAssert
, Klasse verwendet wurde. Das wurde aus einer Junit-4.8-Abhängigkeit gezogen, die eine meiner Abhängigkeiten spezifizierte.Führen Sie Folgendes aus, um zu sehen, welche Abhängigkeiten (und Versionen) von welcher Quelle beim Testen enthalten sind:
quelle
-all
mit-core
, etc ...): Ich hatte wieder hamcrest zurück auf Version 1.1 und jetzt funktioniert alles zu ändern.import static org.mockito.Matchers.anyString;
vonimport static org.mockito.ArgumentMatchers.anyString;
Das Folgende sollte heute am zutreffendsten sein. Beachten Sie, dass Junit 4.11 vom Hamcrest-Core abhängt. Sie sollten also nicht angeben müssen, dass Mockito-All überhaupt nicht verwendet werden kann, da es Hamcrest 1.1 enthält (nicht davon abhängt)
quelle
mockito-all
hat mir geholfen, nichtmockito-core
. Auch Hamcrest vor Mockito inpom.xml
Werken zu erklären .Das hat bei mir funktioniert, nachdem ich ein bisschen gekämpft hatte
quelle
Versuchen
expect(new ThrowableMessageMatcher(new StringContains(message)))
anstatt
expectMessage(message)
Sie können eine benutzerdefinierte
ExpectedException
oder Dienstprogrammmethode schreiben , um den Code zusammenzufassen.quelle
Ich weiß, dass dies ein alter Thread ist, aber was das Problem für mich gelöst hat, war das Hinzufügen des Folgenden zu meinen build.gradle-Dateien. Wie bereits oben erwähnt, liegt ein Kompatibilitätsproblem mit vor
mockito-all
Möglicherweise nützlicher Beitrag :
quelle
Trotz der Tatsache, dass dies eine sehr alte Frage ist und wahrscheinlich viele der oben genannten Ideen viele Probleme gelöst haben, möchte ich die Lösung dennoch mit der Community teilen, die mein Problem behoben hat.
Ich stellte fest, dass das Problem eine Funktion namens "hasItem" war, mit der ich überprüfte, ob ein JSON-Array ein bestimmtes Element enthält oder nicht. In meinem Fall habe ich nach einem Wert vom Typ Long gesucht.
Und das führte zu dem Problem.
Irgendwie haben die Matcher Probleme mit Werten vom Typ Long. (Ich benutze JUnit oder Rest-Assured nicht so sehr, so idk. Genau warum, aber ich denke, dass die zurückgegebenen JSON-Daten nur Ganzzahlen enthalten.)
Was ich also getan habe, um das Problem tatsächlich zu beheben, war das Folgende. Anstatt zu verwenden:
Sie müssen nur in Integer umwandeln. Der Arbeitscode sah also so aus:
Das ist wahrscheinlich nicht die beste Lösung, aber ich wollte nur erwähnen, dass die Ausnahme auch aufgrund falscher / unbekannter Datentypen ausgelöst werden kann.
quelle
Was für mich funktioniert hat, war, die Hamcrest-Gruppe von der Junit-Test-Kompilierung auszuschließen.
Hier ist der Code aus meinem build.gradle:
Wenn Sie IntelliJ ausführen
gradle cleanIdea idea clean build
, müssen Sie möglicherweise ausführen , um die Abhängigkeiten erneut zu erkennen.quelle
Ich weiß, dass dies nicht die beste Antwort ist, aber wenn Sie den Klassenpfad 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 verifyMismatch hinzugefügt.
quelle
Ich habe ein Gradle-Projekt und wenn mein Abschnitt build.gradle-Abhängigkeiten so aussieht:
es führt zu dieser Ausnahme:
Um dieses Problem zu beheben, habe ich "mockito-all" durch "mockito-core" ersetzt.
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 /
quelle
In meinem Fall musste ich einen älteren Hamcrest vom Junit-Vintage ausschließen:
quelle
Das hat bei mir funktioniert. Sie müssen nichts ausschließen. Ich habe nur
mockito-core
stattdessen verwendetmockito-all
quelle