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
benstpierre
источник
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.

CrazyCoder
источник
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».

nutella_eater
источник
Это на самом деле работает, а также имеет смысл, учитывая контекст проблемы.
АгентКноп
В моем случае мне нужно было изменить 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.

Uwe Post
источник
Вам не нужно использовать 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разделе и запустится на устройстве / эмуляторе.
CallMeLaNN
источник
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+.

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

ZahiC
источник
Это работает, но в 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

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

rontho
источник
2

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

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

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

dependencies {
    ...
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}
Кевин ABRIOUX
источник
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 в окне проекта.

ScarOnTheSky
источник
1

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

зима
источник
1

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

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

$ MODULE_DIR $

лиминальная
источник
1

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

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

отвратительный
источник
0

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

Przemo
источник
0

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

testOptions {
    unitTests.returnDefaultValues = true
}

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

Chiara
источник
0

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

Лин W
источник
0

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

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

    testImplementation 'junit:junit:3.8'
Абдул Ризван
источник
0

Я последовал за ответом CrazyCoder, но в зависимости не было показано ни одного файла junit. поэтому я скачал один из http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm , а затем добавил его, нажав кнопку «плюс» справа. И это сработало

Айман Хараке
источник
0

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

Войцех Садурский
источник
0

Замените ваш android.jar в папке libs последней. Вы можете скачать его здесь

DB377
источник
0

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

CrazyLiu
источник
0

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

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

Chenhe
источник
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

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

Олли
источник