web-dev-qa-db-fra.com

JUnit Java.lang.NoSuchMethodError: junit.framework.ComparisonFailure.getExpected () Ljava/lang/String

Je reçois l'exception suivante d'un scénario de test qui a déjà été exécuté avec succès, mais cette exception lève cette exception:

Java.lang.NoSuchMethodError: junit.framework.ComparisonFailure.getExpected()Ljava/lang/String;
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestListener.testFailure(JUnit4TestListener.Java:63)
    at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.Java:100)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.Java:41)
    at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.Java:97)
    at org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener.addError(JUnit38ClassRunner.Java:41)
    at org.junit.internal.runners.JUnit38ClassRunner$OldTestClassAdaptingListener.addFailure(JUnit38ClassRunner.Java:64)
    at junit.framework.TestResult.addFailure(TestResult.Java:46)
    at junit.framework.TestResult.runProtected(TestResult.Java:127)
    at junit.framework.TestResult.run(TestResult.Java:109)
    at junit.framework.TestCase.run(TestCase.Java:118)
    at junit.framework.TestSuite.runTest(TestSuite.Java:208)
    at junit.framework.TestSuite.run(TestSuite.Java:203)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.Java:83)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:49)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)

Quelqu'un sait ce qui cause cela? Cela semble être un problème interne au coureur JUnit.

25
TheWolf

La méthode getExpected() sur junit.framework.ComparisonFailure n'a été ajoutée que dans JUnit 3.8.2 (rappelez-vous que le package junit.framework provient de JUnit 3.8, alors que JUnit 4 utilise org.junit). La méthode n’existait pas dans la version 3.8.1, qui est la version la plus commune de 3.x encore disponible.

Je pense que la méthode a été ajoutée pour faciliter la migration vers les outils JUnit 4 et que cette exception apparaît parfois sur des bases de code plus anciennes qui utilisent JUnit 3.8. Le lanceur de tests Eclipse JUnit 4 semblerait revenir à l'appel du code junit.framework.* lors de l'exécution de tests JUnit 3.8.

Donc, je suppose que vous avez toujours JUnit 3.8.1 en train de rôder dans votre chemin de classe et qu’il entre en conflit avec le programme d’exécution de test Eclipse. Supprimez ce fichier JAR ou mettez-le à niveau vers la version 3.8.2.

21
skaffman

Cela peut également se produire si vous utilisez JUnit 4 mais importez la classe Assert à partir de l'ancien package junit.framework (plutôt que du nouveau package org.junit).

Vérifiez vos importations et vos importations statiques - le coupable pour moi était import static junit.framework.Assert.assertEquals;

12
mtpettyp

La même erreur s’est produite lors de l’exécution de ma classe de test dans Eclipse, mais ma solution était légèrement différente.

Mon installation consistait à avoir jar junit-4.10 dans le chemin de classe, mais ma classe de test utilisait Junit 3 et l'exception ne se produisait que si la méthode assertEquals échouait.

Le problème était qu'Eclipse utilisait toujours le programme Junit 4 Runner. Je l'ai donc modifiée en modifiant la configuration (en sélectionnant "Run Configuration" dans Eclipse, puis en sélectionnant la classe de test, puis en modifiant le "Test Runner" dans la liste déroulante de "JUnit 4 "à" JUnit 3 ").

7
dulon

Le problème dans mon cas était junit-4.5.jar ajouté directement en tant que bibliothèque au projet.

Ma solution consistait à supprimer la dépendance vis-à-vis du junit jar du projet Eclipse et à utiliser la bibliothèque de plug-in JUnit. Celui-ci est ajouté automatiquement ou peut être ajouté manuellement en cliquant sur le bouton Ajouter une bibliothèque sur l'écran de la bibliothèque du projet.

Celui-ci prend JUnit du plugin et a une référence similaire à celle-ci:

.../Eclipse/plugins/org.junit_4.12.0.v201504281640 

Il est également nécessaire de déplacer la bibliothèque JUnit en haut de la liste dans l'onglet Order and Export. Cochez la case pour l'exportation n'est pas nécessaire.

3
ATrubka

J'ai aussi eu le problème, mais c'était parce que j'utilisais JUnit 4.1. Je suis passé à 4,4 et le problème est parti. 

1
Ryan

La vérification des versions de dépendances et des bibliothèques importées est la plus productive dans ce cas.

Par exemple, l'annotation @Test peut être importée à partir de org.junit.Test et non de @org.testng.annotations.Test. Pour le projet Android, cela pourrait entraîner une erreur du type:

Exception dans le thread "principal" Java.lang.NoSuchMethodError: ...

0
Zon

Je n'ai eu le problème qu'après avoir mis à niveau vers la version Kepler d'Eclipse. Le test se déroulerait bien si j'exécutais "Tous". Mais lorsque j’exécutais un test de méthode unique, cette erreur échouait.

J'ai trouvé cette réponse et je pensais la partager ici pour aider quelqu'un d'autre à l'avenir. La mise à niveau vers Junit 4.4 ou mieux

https://www.gotraveltech.com/confluence/display/COOK/My+Eclipse Faites défiler jusqu'à "Comment exécuter des tests individuels JUnit 4.x.x dans MyEclipse?"

0
user2668478