239 votes

Obtention de "NoSuchMethodError : org.hamcrest.Matcher.describeMismatch" lors de l'exécution du test dans IntelliJ 10.5

J'utilise JUnit-dep 4.10 et Hamcrest 1.3.RC2.

J'ai créé un sélecteur personnalisé qui ressemble à ce qui 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 lorsqu'il est exécuté à partir de la ligne de commande en utilisant Ant. Mais lorsqu'il est exécuté depuis IntelliJ, 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)

Je pense qu'il utilise le mauvais hamcrest.MatcherAssert. Comment puis-je trouver quel hamcrest.MatcherAssert il utilise (c'est-à-dire quel fichier jar il utilise pour hamcrest.MatcherAssert) ? AFAICT, le seul jar hamcrest dans mon classpath est 1.3.RC2.

IntelliJ IDEA utilise-t-il sa propre copie de JUnit ou de Hamcrest ?

Comment puis-je afficher le CLASSPATH du runtime qu'IntelliJ utilise ?

5voto

Kai Points 962

Je sais que c'est un vieux sujet mais ce qui a résolu le problème pour moi a été d'ajouter ce qui suit à mes fichiers build.gradle. Comme indiqué plus haut, il y a un problème de compatibilité avec les fichiers mockito-all

Possiblement utile poste :

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'

4voto

Qiang Li Points 41

Essayez

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

au lieu de

expectMessage(message)

Vous pouvez rédiger un texte personnalisé ExpectedException ou une méthode utilitaire pour envelopper le code.

2voto

zeinkap Points 21

En juillet 2020, les dépendances suivantes dans pom.xml ont fonctionné pour moi :

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.1</version>
</dependency>

Avec cette bibliothèque junit 4.13 et hamcrest, il utilise hamcrest.MatcherAssert lors de l'assertion et lance l'exception-. Entrez la description de l'image ici

1voto

Siro Points 68

Bien qu'il s'agisse d'une question très ancienne et que probablement beaucoup des idées mentionnées précédemment ont résolu de nombreux problèmes, je veux quand même partager avec la communauté la solution qui a résolu mon problème.

J'ai découvert que le problème venait d'une fonction appelée "hasItem". que j'utilisais pour vérifier si un tableau JSON contenait ou non un élément spécifique. Dans mon cas, je vérifiais la présence d'une valeur de type Long.

Et cela a conduit au problème.

D'une manière ou d'une autre, les Matchers ont des problèmes avec les valeurs de type Long. (Je n'utilise pas beaucoup JUnit ou Rest-Assured donc je ne sais pas exactement pourquoi, mais je suppose que les données JSON retournées ne contiennent que des entiers).

Ce que j'ai fait pour résoudre le problème est donc le suivant. Au lieu d'utiliser :

long ID = ...;

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

il suffit de le convertir en Integer. Le code utilisé ressemblait donc à ceci :

long ID = ...;

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

Ce n'est probablement pas la meilleure solution, mais je voulais juste mentionner que l'exception peut aussi être levée à cause de types de données incorrects/inconnus.

1voto

André Points 3224

Dans mon cas, j'ai dû exclure un ancien hamcrest de junit-vintage :

<dependency>
  <groupId>org.junit.vintage</groupId>
  <artifactId>junit-vintage-engine</artifactId>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest</artifactId>
  <version>2.1</version>
  <scope>test</scope>
</dependency>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X