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

Я получаю следующее исключение из тестового примера, который успешно работал до этого, но теперь он выдает это исключение:

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)

Кто-нибудь знает, что вызывает это? Это похоже на внутреннюю проблему с бегуном JUnit.

Ответ 1

Метод getExpected() в junit.framework.ComparisonFailure был добавлен только в JUnit 3.8.2 (помните, что пакет junit.framework относится к JUnit 3.8, тогда как JUnit 4 использует org.junit). Метод не был там в 3.8.1, который является наиболее распространенной версией 3.x, все еще там.

Я думаю, что этот метод был добавлен для более простой миграции в JUnit 4 tooling, и иногда это исключение появляется на старых кодовых основаниях, в которых используется JUnit 3.8. Тестер Eclipse JUnit 4, похоже, переключится обратно на вызов кода junit.framework.* при запуске тестов JUnit 3.8.

SO Я предполагаю, что у вас все еще есть JUnit 3.8.1, скрывающийся в вашем пути к классу, и он сталкивается с тестировщиком Eclipse. Либо избавитесь от этого JAR, либо "обновите" его до 3.8.2.

Ответ 2

Это также может произойти, если вы используете JUnit 4, но импортируете класс Assert из старого пакета junit.framework (а не нового пакета org.junit)

Проверьте как ваш импорт, так и ваш статический импорт - виновником для меня стал import static junit.framework.Assert.assertEquals;

Ответ 3

Такая же ошибка возникла при запуске моего тестового класса в eclipse, но мое решение было несколько иным.

Моя настройка состояла в том, что у меня был junit-4.10 jar в пути к классам, но мой тестовый класс использовал junit 3, и исключение произошло только в том случае, если метод assertEquals не удался.

Проблема заключалась в том, что eclipse все еще использовал junit 4 runner, поэтому я изменил его, отредактировав конфигурацию (выбрав "Run Configuration" в eclipse, затем выбрав тестовый класс, а затем изменив "Test Runner" в раскрывающемся списке "JUnit 4" - "JUnit 3" ).

Ответ 4

В моем случае проблема заключалась в junit-4.5.jar, добавленном непосредственно в качестве библиотеки в проект.

Мое решение состояло в том, чтобы удалить зависимость от junit jar от проекта Eclipse и полагаться на библиотеку плагина JUnit. Это добавляется автоматически или может быть добавлено вручную, нажав кнопку "Добавить библиотеку" на экране библиотеки проектов.

Это принимает JUnit из плагина и имеет ссылку, похожее на это:

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

Также необходимо переместить библиотеку JUnit поверх списка на вкладке "Заказ" и "Экспорт". Отметка флажка для экспорта не требуется.

Ответ 5

У меня также была проблема, но это было потому, что я использовал JUnit 4.1. Я переключился на 4.4, и проблема исчезла.

Ответ 6

У меня возникла проблема только после того, как я обновился до версии Kepler Eclipse. Тест будет работать нормально, если я проведу тесты "Все". Но когда я запустил один метод теста, он потерпит неудачу с этой ошибкой.

Я нашел этот ответ и подумал, что поделюсь им, чтобы помочь кому-то еще в будущем. Долгое и короткое это обновление до Junit 4.4 или лучше

https://www.gotraveltech.com/confluence/display/COOK/My+Eclipse Прокрутите вниз до "Как запустить отдельные тесты JUnit 4.x.x в MyEclipse?"

Ответ 7

В этом случае наиболее эффективна проверка версий зависимостей и импортированных библиотек.

Например, аннотация @Test может быть импортирована из org.junit.Test, а не @org.testng.annotations.Test. Для Android-проекта это может привести к ошибке, например:

Исключение в потоке "main" java.lang.NoSuchMethodError:...