IntelliJ IDEA con Junit 4.7 “!!! Prevista la versione 3.8 o successiva di JUnit: "


206

Quando provo a eseguire il seguente test in IntelliJ IDEA ricevo il messaggio:

"!!! JUnit versione 3.8 o successiva prevista:"

Va notato che questo è un progetto Android a cui sto lavorando in 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());
    }
}

La traccia dello stack completo è simile a questa ...

!!! 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, l'ultima patch.
benstpierre,


onestamente ho finalmente puntato sull'uso del plug-in Android in IntelliJ e mi sono morso il proiettile e ho usato l'ultimo Android Studio. tutto bene
Kirby,

In caso qualcun altro è venuto qui senza avere "Test" nel nome della sua classe Test; dovresti aggiungere il fratello "Test". Chiamare la tua classe "GameEngine" causerebbe lo stesso errore, puoi risolverlo rendendolo "GameEngineTest". Saluti!
recepinanc

Risposte:


364

Questo problema si verifica perché la piattaforma Android ( android.jar) contiene già classi JUnit. Il runner di test IDEA carica queste classi e vede che provengono dalla vecchia JUnit, mentre si sta tentando di utilizzare i test annotati che sono una caratteristica della nuova JUnit, quindi si ottiene l'errore dal test runner.

La soluzione è semplice, apri il Project Structure| Modules| Dependenciese spostati junit-4.7.jarverso l' alto, in modo che arrivi prima Android 1.6 Platform nel percorso di classe. Ora il test runner sarà felice mentre carica la nuova versione di JUnit.


9
Solo per rendere le persone consapevoli che questo è ancora un problema con le versioni successive di Android.
Chris.Jenkins,

risolto il problema anche in Mavven posizionando la dipendenza fornita da Android dopo le dipendenze del test
avianey

18
Ho un progetto Android gradle che utilizza robolectric come descritto qui: peterfriese.de/android-testing-with-robolectric e quando sposto la piattaforma Android lontano dal 1 ° nel percorso di classe, ottengo la seguente eccezione:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders

7
In IDEA 14.0.3 per modificare l'ordine delle dipendenze, è necessario utilizzare le frecce. Drag and Drop non funziona.
david.perez,

4
In Android Studio, i file di dipendenza sono generati automaticamente. Quindi non è possibile spostarsi su / giù. Esiste un altro modo per risolvere questo problema?
iMDroid,

35

inserisci qui la descrizione dell'immagine

il mio modulo è un modulo di libreria Java, quindi cambiando JRE a 1.8 Java risolto il problema.

Oppure, puoi anche farlo globalmente tramite Impostazioni modulo> Posizione SDK> JDK, specificando il JDK 8 di Oracle invece della copia dell'SDK di Android.


Questo in realtà funziona e ha anche senso dato il contesto del problema.
AgentKnopf,

Nel mio caso, ho dovuto cambiare JRE per Junit in Predefiniti
Rafael,

Un altro modo: modifica il tuo jdk.table.xml su ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlo C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlsu Windows. Trova il nodo <name value="Android API 28 Platform" />e impostalo <annotationsPath>su <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. Assicurarsi inoltre che il <classPath>nodo contenga platforms/android-28/...in entrambi gli URL del percorso del file. Regola "Android-SDK" sul nome della tua cartella.
Mr-IDE,

Questo funziona per me! Basta passare da Default (API Android 28) a 1.8 (Java) e funziona!
aiueoH

8

Ho avuto questo problema con un progetto multi modulo (libgdx). Un modulo è Java puro e ha test. La mia soluzione era impostare "usa JRE alternativo" su "Java 1.8" nella configurazione di esecuzione dei test delle mie unità. Questo assicura che nessun android.jar sia sul classpath e che venga usato il runner junit 4.x.


Non hai davvero bisogno di usare 1.8. Basta scegliere 1.7 che non viene fornito con Android SDK.
Kingston,

8

Ho avuto lo stesso errore durante la creazione di entrambi Unit Teste Android Instrument Testin Android Studio 1.4+ e ha iniziato a confondersi. Per evitare questo errore, assicurarsi che la classe di test non sia Android TestsattivaRun/Debug Configurations

  1. Assicurati di seguire correttamente le istruzioni https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. Assicurarsi che Test Artifactin Build Variantssia impostato suAndroid Instrumentation Tests
  3. Fai clic sul menu Run>Edit Configuration
  4. Assicurati che il nome della tua classe / metodo sia all'interno Android TestsanzichéJUnit
  5. Se è in JUnitsemplicemente elimina la configurazione e fai clic con il pulsante destro del mouse sul file che desideri testare e di Runnuovo. Creerà quindi la configurazione nella Android Testssezione e verrà eseguita sul dispositivo / emulatore.

4
QUESTO HA FUNZIONATO PER ME => Se è in JUnit, cancella semplicemente la configurazione e fai clic con il tasto destro sul file che vuoi testare ed Esegui di nuovo. Quindi creerà la configurazione nella sezione Test Android e verrà eseguita sul dispositivo / emulatore.
Devendra Vaja,

Ha funzionato anche per me. Ho eseguito lo stesso test dopo averlo spostato da una testcartella all'altra androidTest. Android Studio non ha aggiornato la configurazione della corsa dopo averlo fatto
Daniil,

5

Per Android Studio - a partire da Android Studio 1.1 Beta 4 , Google ha aggiunto il supporto per il plug-in Android Gradle 1.1.0-RC . Il nuovo plug-in supporta Unit Testing tramite Android Studio utilizzando junit 4+.

Questo è ancora sperimentale e ci sono alcuni passaggi manuali per configurarlo.


Funziona ma Android Studio ha ancora problemi con le configurazioni di generazione automatica per i test, quindi ogni volta che devi correggere la configurazione in esecuzione selezionando nuovamente il pacchetto di test. Altrimenti NullPointerException durante l'esecuzione del test.
Alfishe,

4

Per tutti coloro che stanno leggendo questo post e hanno ancora lo stesso problema con AndroidStudio 1.0. Non è possibile modificare l'ordine di dipendenza in AndroidStudio in cui l'IDE li riscrive automaticamente. E, anche se riesci a cambiare l'ordine modificando il file .iml, otterrai una "classe non trovata ...". Questo perché non è possibile impostare il percorso di output del test su AndroidStudio.

In realtà, esiste una soluzione per far funzionare insieme AndroidStudio, Junit e Robolectric. Dai un'occhiata a questo https://github.com/JCAndKSolutions/android-unit-test e usa anche questo plugin: https://github.com/evant/android-studio-unit-test-plugin

Funziona perfettamente per me.


2

Ho avuto lo stesso errore quando ho creato il mio pacchetto junit

inserisci qui la descrizione dell'immagine

Per risolvere questo problema, ho aggiunto queste due righe nel mio file gradle dell'app, come spiegato qui :

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

1

Ci sono due cose che potrei immaginare di accadere

  • Se il tuo IDE tenta di avviare un test Junit Android che viene eseguito direttamente sull'emulatore, non puoi utilizzare Junit4.
  • Se hai utilizzato accidentalmente le classi junit fornite dal vaso Android, non possono essere eseguite su un normale jvm perché ci sono solo classi compilate reali per Android dalvik vm.

1

Questo è successo anche a me in Android Studio 1.1, sebbene dovrebbe supportare unit test senza plug-in.

Su altre macchine (stesso progetto, stessa versione di AS) ho scoperto che durante l'esecuzione di unit test, l'IDE non aggiunge il file android.jar al classpath, mentre nella mia macchina lo fa.

La mia ipotesi migliore è che a causa della conversione che abbiamo fatto da Maven a Gradle e passando da Intellij ad AS, alcune cache di impostazioni sono rimaste da qualche parte nella mia macchina che ha causato l'aggiunta di android.jar al percorso di classe.

Quello che ho fatto è stato cancellare tutte le cache relative ad Android dal mio computer (nella cartella c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

Successivamente ho riaperto il progetto e i test hanno funzionato.

Sto ancora cercando di capire cosa è andato storto, ma questo dovrebbe fare il trucco per ora.


1

Ho riscontrato questo problema in Android Studio 1.5, perché non sapevo di dover cambiare l'impostazione "Test Artefatto" in "Build Variants" (angolo in basso a sinistra della finestra principale) da "Test di strumentazione Android" a "Test di unità" ". Quando lo fai, puoi vedere un file ExampleUnitTest.java nella finestra Progetto.


1

Ho avuto lo stesso problema ma per un altro motivo. Ero su IntelliJ con un normale progetto Java Gradle (non Android) ma il JDK era impostato su Android SDK in Project Structure(era il JDK predefinito per alcuni motivi). Questo è davvero stupido ma IntelliJ non è stato abbastanza gentile da indicarmi cosa c'è che non va, quindi mi sono bloccato.


1

Ecco come l'ho risolto:

Modifica configurazioni -> Impostazioni predefinite -> Android JUnit -> Aggiungi quanto segue alla directory di lavoro:

$ MODULE_DIR $


1

Per me questo problema è stato causato da una configurazione di esecuzione obsoleta / interrotta per i test. Ho semplicemente dovuto eliminare la configurazione, quindi crearne una nuova e il problema è stato risolto.

Elimina la vecchia configurazione di test


0

Nel progetto Android ho avuto minifyEnabled = true, dopo averlo cambiato in falsetutto ha funzionato.


0

Se rimuovi

testOptions {
    unitTests.returnDefaultValues = true
}

dal tuo build.gradlefunzionerà


0

Vai a Project Project -> Platform Setting, modifica SDKs a 1.8 ha risolto il mio problema.


0

Stavo anche affrontando lo stesso problema, dopo essere passato a build.gradle funziona bene per me.

cambia la versione di junit all'interno di build.gradle in:

    testImplementation 'junit:junit:3.8'


0

Disattivare "Usa JDK incorporato" nella Struttura del progetto / Posizione SDK è ciò che mi ha aiutato nel mio caso, ma non so esattamente quale sia stato il motivo del fallimento.


0

Sostituisci il tuo android.jar nella cartella libs con l'ultimo. Puoi scaricarlo da qui


0

In Android Studio, Open Project Structure -> SDK Locationè possibile vedere la JDKposizione, cambiamenti di uso del "Usa incorporato JDK" a voi proprietario JDKdi applicare, poi cambiare di nuovo a "Usa incorporato JDK" , è forse il lavoro


0

Nel mio caso, la modifica JREdella Run Configurationsdose risolve il problema, ma quando faccio clic sul pulsante Esegui accanto alla funzione di test, le JREopzioni verranno ripristinate ai valori predefiniti.

Infine, simile alla risposta di @CrazyLiu Project Structure - SDK Location - JDK, selezionare Embedded JDK. Perché non è presente alcuna casella di controllo in Android Studio 3.6.


0

Ho ricevuto lo stesso messaggio

JUnit version 3.8 or later expected

per un semplice errore da principiante. Avevo usato gli stessi nomi di pacchetto e nomi di classe su src / main e src / test per una classe (la classe HomeController nel mio caso):

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!

Con ciò, la classe HomeController src / main, così come la classe HomeController src / test, avevano lo stesso percorso completo:

com.example.controller.HomeController.class

Il risultato: eventuali test dipendenti dalla classe HomeController non sono riusciti.

La modifica del nome del pacchetto e / o del nome della classe ha risolto il problema. Ecco l'esempio, quando entrambi, il nome del pacchetto e il nome della classe vengono modificati:

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

Ora i nomi delle classi pienamente qualificati differiscono. Il nome della classe HomeController src / main è:

com.example.controller.HomeController.class

e il nome della classe HomeHontrollerTest src / test è:

com.example.test.controller.HomeControllerTest.class

Con i nomi di classe pienamente qualificati univoci, il problema scompare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.