De la “NoSuchMethodError: org.hamcrest.Matcher.describeMismatch” lors de l'exécution de test dans IntelliJ 10.5
Je suis en utilisant JUnit-dep 4.10 et Hamcrest 1.3.RC2.
J'ai créé une correspondance personnalisée qui se présente comme suit:
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 */
}
}
Il fonctionne parfaitement bien lorsque vous exécutez à partir de la ligne de commande à l'aide de Ant. Mais lorsqu'il est exécuté à partir de l'Ide, il échoue avec:
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)
Ma conjecture est que c'est l'utilisation de la mauvaise hamcrest.MatcherAssert. Comment puis-je trouver les hamcrest.MatcherAssert d'utilisation (c'est à dire le fichier jar il utilise pour hamcrest.MatcherAssert)? AFAICT, la seule hamcrest pots dans mon classpath est de 1,3.RC2.
Est IntelliJ IDEA à l'aide de son propre exemplaire de JUnit ou Hamcrest?
Comment puis-je sortie de l'exécution de chemin de classe que l'Ide est l'aide?
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que le hamcrest pot est supérieur à l'importation afin que votre JUnit jar.
JUnit est livré avec son propre
org.hamcrest.Matcher
classe qui est probablement utilisé à la place.Vous pouvez aussi télécharger et utiliser le junit-dep-4.10.jar à la place qui est JUnit sans hamcrest classes.
mockito a aussi le hamcrest des catégories, de sorte que vous pouvez avoir besoin de déplacer\réorganiser ainsi
JUnit 4.11
etHamcrest 2.0.0.0
.Ce problème se pose également lorsque vous avez mockito-tous sur votre chemin de classe, qui est déjà obsolète.
Si possible, il suffit d'inclure mockito-core.
Maven config pour le mélange, junit, mockito et hamcrest:
Le problème était que le mauvais
hamcrest.Matcher
, pashamcrest.MatcherAssert
, la classe a été utilisé. Qui a été tiré à partir d'un junit-4.8 dépendance l'un de mes dépendances fut en précisant.Pour voir quelles sont les dépendances (et les versions) sont inclus à partir de quelle source lors de tests, exécution:
-all
avec-core
, etc...): j'ai dû changer hamcrest retour à la version 1.1 et maintenant tout fonctionne à nouveau.import static org.mockito.Matchers.anyString;
deimport static org.mockito.ArgumentMatchers.anyString;
Les éléments suivants doivent être le plus correct d'aujourd'hui. Remarque, junit 4.11 dépend hamcrest-core, de sorte que vous ne devriez pas avoir besoin de préciser que, à tous, mockito-tout ne peut pas être utilisé car il comprend (dépend) hamcrest 1.1
mockito-all
contribué à moi, pasmockito-core
. Déclarant aussi Hamcrest avant Mockito danspom.xml
œuvres.Cela a fonctionné pour moi, après avoir lutté un peu
Essayer
expect(new ThrowableMessageMatcher(new StringContains(message)))
au lieu de
expectMessage(message)
Vous pouvez écrire une coutume
ExpectedException
ou de l'utilité de la méthode pour encapsuler le code.Je sais que c'est un vieux thread mais ce qui a résolu le problème pour moi était d'ajouter ce qui suit à mon construire.gradle fichiers.
Comme déjà indiqué ci-dessus il y a un problème de compatibilité avec
mockito-all
Peut-être utile post:
Malgré le fait que c'est une très vieille question
et probablement beaucoup de la cités des idées résolu de nombreux problèmes,
J'ai encore envie de partager la solution avec la communauté qui a résolu mon problème.
J'ai trouvé que le problème était d'une fonction appelée "hasItem"
qui j'ai été en utilisant pour vérifier si oui ou non un JSON-Tableau contient un élément spécifique.
Dans mon cas, j'ai vérifié pour une valeur de type Long.
Ce qui a conduit au problème.
En quelque sorte, le Rapprochement avez des problèmes avec des valeurs de type Long.
(Je ne pas utiliser JUnit ou de Repos est Assuré tellement idk. exactement pourquoi,
mais je suppose que le retour JSON données ne contiennent simplement des Entiers.)
Donc ce que j'ai fait pour effectivement corriger le problème était le suivant.
Au lieu d'utiliser:
vous avez juste à cast en Entier.
Donc, le code de travail ressemblait à ceci:
Ce n'est probablement pas la meilleure solution,
mais je voulais juste mentionner que l'exception peut également être levée, car de faux/inconnu types de données.
Ce qui a fonctionné pour moi a été l'exclusion de la hamcrest groupe de junit test de compiler.
Voici le code de mon build.gradle:
Si vous utilisez l'Ide, vous devrez peut-être exécuter
gradle cleanIdea idea clean build
pour détecter les dépendances de nouveau.Je sais que c'est pas la meilleure solution, mais si vous ne pouvez pas obtenir le classpath de travail, c'est un plan B solution.
Dans mon test classpath, j'ai ajouté l'interface suivante avec une implémentation par défaut pour le describeMismatch méthode.
J'ai un projet gradle et quand mon build.gradle la section des dépendances ressemble à ceci:
cela conduit à cette exception:
pour résoudre ce problème, j'ai remplacé "mockito-tout" avec "mockito-core".
L'explication entre mockito-tous et mockito-core peuvent être trouvés ici:
https://solidsoft.wordpress.com/2012/09/11/beyond-the-mockito-refcard-part-3-mockito-core-vs-mockito-all-in-mavengradle-based-projects/
Dans mon cas, j'ai dû l'exclure une ancienne hamcrest junit-vintage:
Cela a fonctionné pour moi. Pas besoin d'exclure quoi que ce soit. J'ai juste utilisé
mockito-core
au lieumockito-all