IntelliJ IDEA з Junit 4.7 “!!! Очікувана версія JUnit 3.8 або новішої версії: "


206

Коли я намагаюся запустити наступний тест в IntelliJ IDEA, я отримую повідомлення:

"!!! Очікувана версія 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, останній патч.
benstpierre

У мене є рішення тут stackoverflow.com/questions/29172698 / ...
voronnenok

чесно кажучи, я нарешті покарав за використання плагіну Android в IntelliJ і кусав кулю та використовував останню Android Studio. все добре
Кірбі

На випадок, коли хтось інший прийшов сюди, не маючи "Тест" у назві їхнього класу Тестів; ви повинні додати брата "Тест". Ім'я вашого класу "GameEngine" призведе до тієї ж помилки, ви можете вирішити її, зробивши її "GameEngineTest". Ура!
recepinanc

Відповіді:


364

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

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


9
Просто для того, щоб люди усвідомлювали це, все ще залишається проблемою з пізнішими версіями Android.
Chris.Jenkins

вирішили проблему і в Maven, поставивши андроїд за умови залежності після тестових залежностей
avianey

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

7
У IDEA 14.0.3 для зміни порядку залежних груп слід використовувати стрілки. Перетягування не працює.
david.perez

4
В андроїд-студії файли залежності автоматично генеруються. Отже, неможливо рухатись вгору / вниз. Чи є інший спосіб вирішити це питання?
iMDroid

35

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

мій модуль - це модуль бібліотеки Java, тому зміна JRE на 1,8 java вирішила проблему.

Або ви також можете це зробити у всьому світі за допомогою Налаштування модуля> Місце розташування SDK> JDK, вказавши JDK 8 Oracle замість копії Android SDK.


Це насправді працює, а також має сенс зважаючи на контекст проблеми.
AgentKnopf

У моєму випадку мені потрібно було змінити JRE на Junit у налаштуваннях за замовчуванням
Рафаель,

Інший спосіб: відредагуйте jdk.table.xml у ~/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" до назви вашої папки.
Містер-ІДЕ

Це працює для мене! Просто змініть з Default (Android API 28) на 1.8 (Java), і це працює!
aiueoH

8

У мене була ця проблема з проектом з декількома модулями (libgdx). Один модуль є чистою Java і має тести. Моїм рішенням було встановити "використовувати альтернативний JRE" на "Java 1.8" в конфігурації запуску моїх тестових одиниць. Це гарантує, що жоден android.jar не стоїть на класі, і використовується junit 4.x runner.


Вам не потрібно використовувати 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 і запуститься на пристрої / емуляторі.
Девендра Ваджа

Працював і для мене. Я провів той самий тест після переміщення його з 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

У мене є та сама помилка, коли я створюю свій власний пакет для джуніту

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

Щоб виправити це, я додав ці два рядки до файлу gradle додатка, як це пояснено тут :

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, наданими з баночки для android, вони не можуть працювати на звичайному jvm, оскільки існують лише реальні компільовані класи для vm для android dalvik.

1

Це трапилося і зі мною в Android Studio 1.1, хоча він повинен підтримувати тести модулів без плагіна.

На інших машинах (той же проект, та сама версія AS) я виявив, що під час запуску одиничних тестів IDE не додає файл android.jar до classpath, тоді як у моїй машині це робиться.

Моя найкраща здогадка полягала в тому, що завдяки перетворенню, яку ми здійснили з 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 (не андроїд), але JDK було встановлено на SDK для Android 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 це добре працює для мене.

змінити версію верху для версії build.gradle на:

    testImplementation 'junit:junit:3.8'


0

Вимкнення "Використовувати вбудований JDK" у структурі проекту / SDK Location - це те, що допомогло в моєму випадку, але я не знаю точно, що було причиною його відмови в першу чергу.


0

Замініть свій android.jar у папці libs на останню. Ви можете завантажити його звідси


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 / тест 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.