IntelliJ IDEA mit Junit 4.7 “!!! JUnit Version 3.8 oder höher erwartet: ”

206

Wenn ich versuche, den folgenden Test in IntelliJ IDEA auszuführen, wird folgende Meldung angezeigt:

"!!! JUnit Version 3.8 oder höher erwartet:"

Es ist zu beachten, dass dies ein Android- Projekt ist, an dem ich in IntelliJ IDEA 9 arbeite.

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());
    }
}

Die vollständige Stapelverfolgung sieht folgendermaßen aus ...

!!! 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
quelle
Intellij 9, der neueste Patch.
Benstpierre
Ich habe Lösung hier stackoverflow.com/questions/29172698/…
voronnenok
Ehrlich gesagt habe ich mich endlich auf die Verwendung des Android-Plugins in IntelliJ konzentriert und die Kugel gebissen und das neueste Android Studio verwendet. Alles ist in Ordnung
Kirby
Falls jemand anderes hierher gekommen ist, ohne "Test" im Namen seiner Testklasse zu haben; Sie sollten "Test" Bruder hinzufügen. Wenn Sie Ihre Klasse "GameEngine" nennen, wird derselbe Fehler verursacht. Sie können ihn beheben, indem Sie ihn zu "GameEngineTest" machen. Prost!
Empfang

Antworten:

364

Dieses Problem tritt auf, weil Android Platform (android.jar ) bereits JUnit-Klassen enthält. Der IDEA-Testläufer lädt diese Klassen und stellt fest, dass sie von der alten JUnit stammen, während Sie versuchen, kommentierte Tests zu verwenden, die eine Funktion der neuen JUnit sind. Daher erhalten Sie den Fehler vom Testläufer.

Die Lösung ist einfach, öffnen Sie die Project Structure| Modules| Dependencies, und bewegen Sie die nach junit-4.7.jaroben, so dass es vorher Android 1.6 Platform im Klassenpfad kommt. Jetzt freut sich der Testläufer über das Laden der neuen JUnit-Version.

CrazyCoder
quelle
9
Nur um die Leute darauf aufmerksam zu machen, ist dies immer noch ein Problem mit späteren Versionen von Android.
Chris.Jenkins
löste das Problem auch in Maven, indem die von Android bereitgestellte Abhängigkeit nach den Testabhängigkeiten platziert wurde
Testabhängigkeiten platziert wurde
18
Ich habe ein Gradle-Android-Projekt, das Robolectric verwendet, wie hier beschrieben: peterfriese.de/android-testing-with-robolectric. Wenn ich die Android-Plattform vom 1. im Klassenpfad wegschiebe, erhalte ich die folgende Ausnahme:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders
7
In IDEA 14.0.3 zum Ändern der Abhängigkeitsreihenfolge sollten Sie die Pfeile verwenden. Drag & Drop funktioniert nicht.
david.perez
4
In Android Studio werden die Abhängigkeitsdateien automatisch generiert. Daher ist es nicht möglich, sich nach oben / unten zu bewegen. Gibt es einen anderen Weg, um dieses Problem zu lösen?
iMDroid
35

Geben Sie hier die Bildbeschreibung ein

Mein Modul ist ein Java-Bibliotheksmodul, daher wurde das Problem durch Ändern von JRE auf 1.8 Java behoben.

Sie können dies auch global über Moduleinstellungen> SDK-Speicherort> JDK tun, indem Sie das JDK 8 von Oracle anstelle der Kopie des Android SDK angeben.

nutella_eater
quelle
Dies funktioniert tatsächlich und ist auch angesichts des Problemkontexts sinnvoll.
AgentKnopf
In meinem Fall musste ich JRE für Junit in Defaults ändern
Rafael
Ein anderer Weg: Bearbeiten Sie Ihre Datei jdk.table.xml unter ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmloder C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlunter Windows. Suchen Sie den Knoten <name value="Android API 28 Platform" />und setzen Sie ihn <annotationsPath>auf <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. Stellen Sie außerdem sicher, dass der <classPath>Knoten platforms/android-28/...in beiden Dateipfad-URLs enthalten ist. Passen Sie "Android-SDK" an Ihren Ordnernamen an.
Mr-IDE
Das funktioniert bei mir! Wechseln Sie einfach von Standard (Android API 28) zu 1.8 (Java) und es funktioniert!
aiueoH
8

Ich hatte dieses Problem mit einem Multi-Modul-Projekt (libgdx). Ein Modul ist reines Java und hat Tests. Meine Lösung bestand darin, "alternative JRE verwenden" in der Ausführungskonfiguration meiner Komponententests auf "Java 1.8" zu setzen. Dadurch wird sichergestellt, dass sich keine android.jar im Klassenpfad befindet und der junit 4.x-Runner verwendet wird.

Uwe Post
quelle
Sie müssen 1.8 nicht wirklich verwenden. Es reicht aus, 1.7 zu wählen, das nicht mit dem Android SDK geliefert wird.
Kingston
8

Ich habe den gleichen Fehler beim Erstellen von beiden Unit Testund Android Instrument Testin Android Studio 1.4+ erhalten und es begann verwirrt zu werden. Um zu vermeiden , diesen Fehler zu machen , dass Ihre Testklasse fällt unter Android TestsaufRun/Debug Configurations

  1. Stellen Sie sicher, dass Sie die Anweisungen https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html ordnungsgemäß befolgen
  2. Stellen Sie sicher, dass Test Artifactin auf eingestellt Build VariantsistAndroid Instrumentation Tests
  3. Klicken Sie auf Menü Run>Edit Configuration
  4. Stellen Sie sicher, dass sich Ihr Klassen- / Methodenname innerhalb Android Testsvon befindetJUnit
  5. Wenn es in ist, JUnitlöschen Sie einfach die Konfiguration und klicken Sie mit der rechten Maustaste auf die Datei, die Sie testen möchten und Runerneut. Anschließend wird die Konfiguration unter Android TestsAbschnitt erstellt und auf dem Gerät / Emulator ausgeführt.
CallMeLaNN
quelle
4
DAS HAT FÜR MICH ARBEITET => Wenn es in JUnit ist, löschen Sie einfach die Konfiguration und klicken Sie mit der rechten Maustaste auf die Datei, die Sie testen möchten, und führen Sie sie erneut aus. Anschließend wird die Konfiguration im Abschnitt "Android-Tests" erstellt und auf dem Gerät / Emulator ausgeführt.
Devendra Vaja
Hat auch für mich gearbeitet. Ich habe den gleichen Test ausgeführt, nachdem ich ihn von testOrdner zu androidTestOrdner verschoben habe. Android Studio hat die Laufkonfiguration danach nicht aktualisiert
Daniil
5

Für Android Studio - ab Android Studio 1.1 Beta 4 hat Google die Unterstützung für das Android Gradle-Plugin 1.1.0-RC hinzugefügt . Das neue Plugin unterstützt Unit Testing über Android Studio mit junit 4+.

Dies ist noch experimentell und es gibt einige manuelle Schritte , um dies einzurichten.

ZahiC
quelle
Es funktioniert, aber Android Studio hat immer noch Probleme mit der automatischen Generierung von Konfigurationen für Tests, sodass Sie jedes Mal die laufende Konfiguration korrigieren müssen, indem Sie das Testpaket erneut auswählen. Andernfalls NullPointerException während des Testlaufs.
Alfishe
4

Für alle, die diesen Beitrag lesen und immer noch das gleiche Problem mit AndroidStudio 1.0 haben. Sie können die Abhängigkeitsreihenfolge in AndroidStudio nicht ändern. Die IDE schreibt sie automatisch neu. Und selbst wenn Sie es schaffen, die Reihenfolge durch Ändern der IML-Datei zu ändern, erhalten Sie eine "Klasse nicht gefunden ...". Dies liegt daran, dass der Testausgabepfad in AndroidStudio nicht festgelegt werden kann.

Tatsächlich gibt es eine Lösung, mit der AndroidStudio, Junit und Robolectric zusammenarbeiten können. Schauen Sie sich diese https://github.com/JCAndKSolutions/android-unit-test an und verwenden Sie auch dieses Plugin: https://github.com/evant/android-studio-unit-test-plugin

Funktioniert perfekt für mich.

Rontho
quelle
2

Ich habe den gleichen Fehler, wenn ich mein eigenes Junit-Paket erstellt habe

Geben Sie hier die Bildbeschreibung ein

Um dies zu beheben, habe ich diese beiden Zeilen in meine App-Gradle-Datei eingefügt, wie hier erklärt :

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

Ich könnte mir zwei Dinge vorstellen, die passieren könnten

  • Wenn Ihre IDE versucht, einen Android Junit-Test zu starten, der direkt auf dem Emulator ausgeführt wird, können Sie Junit4 nicht verwenden.
  • Wenn Sie versehentlich die aus dem Android-JAR bereitgestellten Junit-Klassen verwendet haben, können sie nicht auf einem normalen JVM ausgeführt werden, da es nur wirklich kompilierte Klassen für das Android-Dalvik-VM gibt.
Janusz
quelle
1

Dies ist mir auch in Android Studio 1.1 passiert - obwohl es Unit-Tests ohne Plugin unterstützen sollte.

Auf anderen Computern (dasselbe Projekt, dieselbe Version von AS) stellte ich fest, dass die IDE beim Ausführen von Komponententests die Datei android.jar nicht zum Klassenpfad hinzufügt, während dies auf meinem Computer der Fall ist.

Meine beste Vermutung war, dass aufgrund der Konvertierung von Maven nach Gradle und der Umstellung von Intellij auf AS irgendwo auf meinem Computer ein Cache mit Einstellungen verblieben ist, der dazu führte, dass android.jar zum Klassenpfad hinzugefügt wurde.

Ich habe alle Android-bezogenen Caches von meinem Computer gelöscht (im Ordner c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

Danach habe ich das Projekt wieder geöffnet und die Tests haben funktioniert.

Ich versuche immer noch zu verstehen, was schief gelaufen ist, aber das sollte vorerst den Trick machen.

Yossi Shmueli
quelle
1

Ich hatte dieses Problem in Android Studio 1.5, weil ich nicht wusste, dass ich die Einstellung "Testartefakt" in den "Build-Varianten" (untere linke Ecke des Hauptfensters) von "Android-Instrumentierungstests" auf "Komponententests" ändern musste ". Wenn Sie dies tun, können Sie im Projektfenster eine ExampleUnitTest.java-Datei sehen.

ScarOnTheSky
quelle
1

Ich hatte das gleiche Problem, aber aus einem anderen Grund. Ich war auf IntelliJ mit einem regulären Java-Gradle-Projekt (nicht Android), aber das JDK wurde auf das Android SDK in eingestellt Project Structure(war aus bestimmten Gründen das Standard-JDK). Das ist wirklich dumm, aber IntelliJ war nicht nett genug, um mir anzuzeigen, was los ist, also blieb ich dabei.

Winter
quelle
1

So habe ich es gelöst:

Konfigurationen bearbeiten -> Standardeinstellungen -> Android JUnit -> Folgendes zum Arbeitsverzeichnis hinzufügen:

$ MODULE_DIR $

liminal
quelle
1

Für mich wurde dieses Problem durch eine veraltete / fehlerhafte Laufkonfiguration für die Tests verursacht. Ich musste einfach die Konfiguration löschen, dann eine neue erstellen und das Problem wurde behoben.

Löschen Sie die alte Testkonfiguration

schockierend
quelle
0

Im Android-Projekt hatte ich minifyEnabled = true, nachdem ich es geändert hatte, falsealles funktioniert.

Przemo
quelle
0

Wenn Sie entfernen

testOptions {
    unitTests.returnDefaultValues = true
}

von deinem wird build.gradlees funktionieren

Chiara
quelle
0

Gehen Sie zu Projektstruktur -> Plattformeinstellung, ändern Sie SDKs in 1.8, um mein Problem zu lösen.

Lin W.
quelle
0

Ich hatte auch das gleiche Problem, nachdem ich in build.gradle gewechselt bin, funktioniert es gut für mich.

Ändern Sie Ihre Junit-Version in build.gradle in:

    testImplementation 'junit:junit:3.8'
Abdul Rizwan
quelle
0

Ich folgte der Antwort von CrazyCoder, aber in Abhängigkeiten wurde keine Junit-Datei angezeigt. Also habe ich eine von http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm heruntergeladen und sie dann durch Drücken der Plus-Taste rechts hinzugefügt. Und es hat funktioniert

Ayman Harake
quelle
0

Das Deaktivieren von "Embedded JDK verwenden" in der Projektstruktur / SDK-Position hat in meinem Fall geholfen, aber ich weiß nicht genau, warum es überhaupt fehlgeschlagen ist.

Wojciech Sadurski
quelle
0

Ersetzen Sie Ihre android.jar im libs- Ordner durch die neueste. Sie können es hier herunterladen

DB377
quelle
0

In Android Studio, Open Project Structure -> SDK Locationkönnen Sie sehen , JDKStandort, ändern Verwendung „Use Embedded JDK“ Sie besitzen JDKbewerben, dann ändern zurück zu „Use eingebettet JDK“ , vielleicht ist es Arbeit

CrazyLiu
quelle
0

In meinem Fall Änderung JREin Run ConfigurationsDosis das Problem lösen, aber wenn ich die Lauftaste klicken Sie neben der Testfunktion, die JREwerden Optionen auf Standardwerte zurückzusetzen.

Schließlich, ähnlich wie bei @CrazyLius Antwort Project Structure - SDK Location - JDK, wählen Sie in Embedded JDK. Weil es in Android Studio 3.6 kein Kontrollkästchen gibt.

Chenhe
quelle
0

Ich habe die gleiche Nachricht erhalten

JUnit version 3.8 or later expected

durch einen einfachen Anfängerfehler. Ich hatte für eine Klasse (in meinem Fall die HomeController-Klasse) dieselben Paket- und Klassennamen in src / main und src / test verwendet:

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!

Damit hatten die src / main HomeController-Klasse sowie die src / test HomeController-Klasse denselben vollständigen Pfad:

com.example.controller.HomeController.class

Das Ergebnis: Alle Tests, die von der HomeController-Klasse abhängig waren, sind fehlgeschlagen.

Durch Ändern des Paketnamens und / oder des Klassennamens wurde das Problem behoben. Hier das Beispiel, wenn sowohl der Paketname als auch der Klassenname geändert werden:

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

Jetzt unterscheiden sich die vollqualifizierten Klassennamen. Der Name der src / main HomeController-Klasse lautet:

com.example.controller.HomeController.class

und der Name der src / test HomeHontrollerTest-Klasse lautet:

com.example.test.controller.HomeControllerTest.class

Da die vollständig qualifizierten Klassennamen eindeutig sind, verschwindet das Problem.

Olli
quelle