IntelliJ IDEA с Junit 4.7 “!!! Ожидается версия JUnit 3.8 или более поздняя:


206

Когда я пытаюсь запустить следующий тест в IntelliJ IDEA, я получаю сообщение:

Msgstr "!!! Ожидается версия JUnit 3.8 или более поздняя:"

Следует отметить, что это проект Android, над которым я работаю в IntelliJ IDEA 9.

public class GameScoreUtilTest {
    @Test
    public void testCalculateResults() throws Exception {
        final Game game = new Game();

        final Player player1 = new Player();
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(1);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        {
            final PlayedHole playedHole = new PlayedHole();
            playedHole.setScore(3);
            game.getHoleScoreMap().put(player1, playedHole);
        }
        final GameResults gameResults = GameScoreUtil.calculateResults(game);

        assertEquals(4, gameResults.getScore());
    }
}

Полная трассировка стека выглядит следующим образом ...

!!! JUnit version 3.8 or later expected:

java.lang.RuntimeException: Stub!
    at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
    at junit.textui.TestRunner.<init>(TestRunner.java:54)
    at junit.textui.TestRunner.<init>(TestRunner.java:48)
    at junit.textui.TestRunner.<init>(TestRunner.java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:152)
    at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:136)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)

Process finished with exit code -3

Intellij 9, последний патч.
— Бенстпьерр

У меня есть решение здесь stackoverflow.com/questions/29172698/…
— voronnenok

Честно говоря, я наконец-то наказал за использование плагина Android в IntelliJ, укусил пулю и использовал последнюю версию Android Studio. все в порядке
— Кирби

Если кто-то пришел сюда без «Test» в названии своего класса Test; Вы должны добавить «Тест», брат. Присвоение имени вашему классу «GameEngine» приведет к той же ошибке, вы можете решить ее, сделав «GameEngineTest». Ура!
— Recepanc

Ответы:


364

Эта проблема возникает из-за того, что Android Platform ( android.jar) уже содержит классы JUnit. Тестовый прогон IDEA загружает эти классы и видит, что они из старого JUnit, в то время как вы пытаетесь использовать аннотированные тесты, которые являются функцией нового JUnit, поэтому вы получаете ошибку от тестового бегуна.

Решение простое, откройте Project Structure| Modules| Dependenciesи двигайте junit-4.7.jarвверх так, чтобы он был впереди Android 1.6 Platform в classpath. Теперь бегущий тест будет счастлив, поскольку он загружает новую версию JUnit.


9
Просто чтобы люди знали, что это все еще проблема с более поздними версиями Android.
— Chris.Jenkins

также решил проблему в maven, поместив Android-зависимости после проверки зависимостей
— avianey

18
У меня есть отличный проект Android, который использует robolectric, как описано здесь: peterfriese.de/android-testing-with-robolectric, и когда я перемещаю платформу Android с 1-го места в пути к классам, я получаю следующее исключение:Class not found: "com.example.intellijgradletest.MainActivityTest"
— Heath Borders

7
В IDEA 14.0.3 для изменения порядка зависимостей вы должны использовать стрелки. Перетаскивание не работает.
— david.perez

4
В Android Studio файлы зависимостей генерируются автоматически. Следовательно, невозможно двигаться вверх / вниз. Есть ли другой способ решить эту проблему?
— iMDroid

35

введите описание изображения здесь

Мой модуль является модулем библиотеки Java, поэтому изменение JRE до версии 1.8 решило проблему.

Или вы также можете сделать это глобально через «Настройки модуля»> «Расположение SDK»> «JDK», указав «Oracle JDK 8» вместо копии «Android SDK».


Это на самом деле работает, а также имеет смысл, учитывая контекст проблемы.
— АгентКноп

В моем случае мне нужно было изменить JRE на Junit в настройках по умолчанию
— Рафаэль

Другой способ: отредактируйте свой jdk.table.xml в Windows ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlили C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlв Windows. Найдите узел <name value="Android API 28 Platform" />и установите его <annotationsPath>в <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. Также убедитесь, что <classPath>узел содержится platforms/android-28/...в обоих URL-адресах файлов. Настройте «Android-SDK» на имя вашей папки.
— Mr-IDE

Это работает для меня! Просто измените с Default (Android API 28) на 1.8 (Java), и это работает!
— aiueoH

8

У меня была эта проблема с многомодульным проектом (libgdx). Один модуль - чистая Java и имеет тесты. Мое решение состояло в том, чтобы установить «использовать альтернативную JRE» на «Java 1.8» в конфигурации выполнения моих модульных тестов. Это гарантирует, что на пути к классам нет android.jar и используется раннер junit 4.x.


Вам не нужно использовать 1.8. Достаточно выбрать 1.7, который не поставляется с Android SDK.
— Кингстон

8

Я получил ту же ошибку при создании обоих Unit Testи Android Instrument Testв Android Studio 1.4+, и это начало сбиваться с толку. Чтобы избежать этой ошибки , убедитесь , что ваш тест класс подпадает под Android TestsнаRun/Debug Configurations

  1. Убедитесь, что вы правильно следуете инструкции https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. Убедитесь , что Test Artifactв Build Variantsустановлен вAndroid Instrumentation Tests
  3. Нажмите меню Run>Edit Configuration
  4. Убедитесь, что ваше имя класса / метода находится внутри, Android Testsа неJUnit
  5. Если это так, JUnitпросто удалите конфигурацию и щелкните правой кнопкой мыши на файле, который вы хотите проверить, и Runснова. Затем он создаст конфигурацию в Android Testsразделе и запустится на устройстве / эмуляторе.

4
ЭТО РАБОТАЕТ ДЛЯ МЕНЯ => Если это в JUnit, просто удалите конфигурацию и щелкните правой кнопкой мыши файл, который вы хотите протестировать, и снова запустите. Затем он создаст конфигурацию в разделе Android Tests и запустит ее на устройстве / эмуляторе.
— Девендра Важа

У меня тоже сработало. Я провел тот же тест после перемещения его из testпапки в androidTestпапку. После этого Android Studio не обновляла конфигурацию запуска
— Даниил

5

Для Android Studio - начиная с Android Studio 1.1 Beta 4 , Google добавил поддержку плагина Android Gradle 1.1.0-RC . Новый плагин поддерживает юнит-тестирование через Android Studio с использованием junit 4+.

Это все еще эксперимент, и есть некоторые ручные шаги, чтобы настроить это.


Это работает, но в Android Studio все еще есть проблемы с автоматической генерацией конфигураций для тестов, поэтому каждый раз, когда вам приходится исправлять текущую конфигурацию, перевыбирая тестовый пакет. В противном случае NullPointerException во время пробного запуска.
— Альфише

4

Для всех, кто читает этот пост и до сих пор имеет ту же проблему с AndroidStudio 1.0. Вы не можете изменить порядок зависимостей в AndroidStudio, если среда IDE перезаписывает их автоматически. И даже если вам удастся изменить порядок, изменив файл .iml, вы получите «класс не найден ...». Это связано с тем, что путь вывода теста не может быть установлен в AndroidStudio.

На самом деле, есть решение для совместной работы AndroidStudio, Junit и Robolectric. Взгляните на этот https://github.com/JCAndKSolutions/android-unit-test и используйте этот плагин: https://github.com/evant/android-studio-unit-test-plugin

У меня отлично работает.


2

У меня та же ошибка, когда я создаю свой собственный пакет Junit

введите описание изображения здесь

Чтобы исправить это, я добавил эти две строки в мой файл приложения, как описано здесь :

dependencies {
    ...
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}

1

Есть две вещи, которые я мог представить

  • Если ваша IDE пытается запустить тест Android Junit, который запускается непосредственно на эмуляторе, вы не можете использовать Junit4.
  • Если вы случайно использовали классы junit, предоставляемые из jar android, они не смогут работать на обычном jvm, потому что существуют только реальные скомпилированные классы для android dalvik vm.

1

Это произошло и со мной в Android Studio 1.1 - хотя он должен поддерживать модульные тесты без плагина.

На других машинах (тот же проект, та же версия AS) я обнаружил, что при запуске модульных тестов среда IDE не добавляет файл android.jar в путь к классам, в то время как на моей машине это происходит.

Мое лучшее предположение состояло в том, что из-за преобразования, которое мы сделали из Maven в Gradle и перехода от intellij к AS, где-то на моей машине оставался некоторый кеш настроек, что привело к добавлению android.jar в classpath.

Я удалил все кэши, связанные с Android, с моего компьютера (в папке c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

После этого я снова открыл проект, и тесты сработали.

Все еще пытаюсь понять, что пошло не так, но сейчас это должно сработать.


1

У меня была эта проблема в Android Studio 1.5, потому что я не знал, что мне пришлось переключить настройку «Тестировать артефакт» в «Вариантах сборки» (в левом нижнем углу главного окна) с «Тестов инструментария Android» на «Модульные тесты». ». Когда вы это сделаете, вы увидите файл ExampleUnitTest.java в окне проекта.


1

У меня была такая же проблема, но по другой причине. Я был на IntelliJ с обычным проектом Java Gradle (не Android), но JDK был установлен на Android SDK в Project Structure(был JDK по умолчанию по некоторым причинам). Это действительно глупо, но IntelliJ не был достаточно хорош, чтобы указать мне, что случилось, поэтому я застрял на этом.


1

Вот как я это решил:

Изменить настройки -> Значения по умолчанию -> Android JUnit -> Добавить следующее в рабочий каталог:

$ MODULE_DIR $


1

Для меня эта проблема была вызвана устаревшей / неработающей конфигурацией тестов. Я просто должен был удалить конфигурацию, затем создать новую, и проблема была исправлена.

Удалить старую тестовую конфигурацию


0

В проекте Android у меня было minifyEnabled = true, после того, как я изменил его, чтобы falseвсе работало.


0

Если вы удалите

testOptions {
    unitTests.returnDefaultValues = true
}

от твоего build.gradleэто будет работать


0

Перейдите в Структура проекта -> Настройка платформы, измените SDK на 1.8, и я решил мою проблему.


0

Я также столкнулся с той же проблемой, после перехода в build.gradle у меня все работает нормально.

измените свою версию junit внутри build.gradle на:

    testImplementation 'junit:junit:3.8'


0

Отключение «Использовать встроенный JDK» в Project Structure / SDK Location - это то, что помогло в моем случае, но я точно не знаю, по какой причине он потерпел неудачу.



0

В AndroidStudio Open Project Structure -> SDK Locationвы можете увидеть JDKместоположение, изменить использование «Использовать встроенный JDK» на свое собственное, JDKчтобы применить его, а затем вернуться к «Использовать встроенный JDK» , возможно, это работает


0

В моем случае, изменения JREв Run Configurationsдозе решить эту проблему, но когда я нажимаю кнопку запуска рядом с функцией тестирования, то JREпараметры будут сброшены по умолчанию.

Наконец, аналогично ответу @CrazyLiu Project Structure - SDK Location - JDK, выберите Embedded JDK. Потому что в Android Studio 3.6 нет флажка.


0

Я получил то же сообщение

JUnit version 3.8 or later expected

простой ошибкой новичка. Я использовал те же имена пакетов и имена классов в src / main и src / test для класса (класс HomeController в моем случае):

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--ApplicationTest.java
          +--controller
            +--HomeController.java  <---- same package and class name: not good!

При этом класс src / main HomeController, а также класс src / test HomeController имели одинаковый полный путь:

com.example.controller.HomeController.class

Результат: все тесты, которые зависели от класса HomeController, не прошли.

Либо изменение имени пакета и / или имени класса решило проблему. Вот пример, когда и имя пакета, и имя класса изменяются:

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.java
          +--controller
            +--HomeController.java
    +--test
      +--com
        +--example
          +--test                       <---- added (optional)
            +--ApplicationTest.java
            +--controller
              +--HomeControllerTest.java    <---- changed

Теперь полные имена классов отличаются. Имя класса src / main HomeController:

com.example.controller.HomeController.class

и имя класса src / test HomeHontrollerTest:

com.example.test.controller.HomeControllerTest.class

С полностью определенными именами классов проблема исчезает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.