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 ?

277voto

Garrett Hall Points 11902

Assurez-vous que le hamcrest est plus haut dans la commande d'importation que votre JUnit jarre.

JUnit est accompagné de son propre org.hamcrest.Matcher qui est probablement utilisée à la place.

Vous pouvez également télécharger et utiliser le junit-dep-4.10.jar à la place qui est JUnit sans les classes hamcrest.

mockito a aussi les classes de hamcrest, donc vous devrez peut-être bouger \reorder elle aussi

1 votes

L'OP a dit qu'ils utilisaient déjà la jarre '-dep-'. Mais votre hypothèse selon laquelle il utilise la classe Matcher du jar de JUnit semble correcte. C'est donc probablement que l'IDE utilise sa propre copie de JUnit.

2 votes

J'ai supprimé la copie d'IntelliJ de junit.jar et junit-4.8.jar, installé junit-dep-4.10.jar dans le répertoire lib/ d'IntelliJ, et le problème se produit toujours.

0 votes

Avez-vous vérifié le .classppath pour vous assurer qu'il n'y a pas d'autres entrées JUnit ?

176voto

Tom Parkinson Points 613

Ce problème se pose également lorsque vous avez mockito-all sur votre chemin de classe, ce qui est déjà déprécié.

Si possible, incluez simplement mockito-core .

Configuration Maven pour mélanger junit, mockito et hamcrest :

<dependencies>
  <dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>1.3</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

0 votes

C'est exactement l'indication dont j'avais besoin. L'idée est simplement de vérifier toutes ces jarres über pour les dépendances cachées. Ou mieux encore, d'être paresseux et de ne pas les utiliser du tout.

2 votes

Tout comme les nouvelles versions de mockito incluent hamcrest, il en va de même pour powermock !

3 votes

Cela devrait-il être mockito-core au lieu de mockito-all ?

62voto

Noel Yap Points 3008

Le problème était que le mauvais hamcrest.Matcher pas hamcrest.MatcherAssert la classe était utilisée. Elle était tirée d'une dépendance de junit-4.8 que l'une de mes dépendances spécifiait.

Pour voir quelles dépendances (et versions) sont incluses à partir de quelle source pendant les tests, exécutez :

mvn dependency:tree -Dscope=test

5 votes

J'ai eu le même problème. J'utilisais JUnit-dep et Hamcrest-core mais j'avais Powermock listé plus tôt dans le pom ce qui faisait que JUnit était inclus avant JUnit-dep et Hamcrest.

9 votes

De plus, mockito-all inclut certaines classes de Hamcrest. Il est préférable d'utiliser mockito-core et d'exclure la dépendance de Hamcrest.

3 votes

Je viens de tomber sur le même problème. La solution a été d'augmenter la version de junit à 4.11 qui est compatible (i.e. "contient des classes de") avec hamcrest 1.3.

28voto

Ulf Lindback Points 5235

Ce qui suit devrait être le plus correct aujourd'hui. Note : junit 4.11 dépend de hamcrest-core, donc vous ne devriez pas avoir besoin de le spécifier du tout, mockito-all ne peut pas être utilisé puisqu'il comprend (ne dépend pas de) hamcrest 1.1

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.8</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

14voto

Raul Points 571

Cela a fonctionné pour moi après avoir lutté un peu

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
 </dependency>

 <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
 </dependency>

 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
 </dependency>

0 votes

C'est la même chose pour moi. Mettre les dépendances dans cet ordre aide maven à résoudre correctement les deps transitifs. Exclure explicitement hamcrest de mockito-core ou mockito-all pourrait être plus sûr cependant, au cas où quelqu'un réorganise les dépendances dans votre pom.

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