IntelliJ IDEA avec Junit 4.7 “!!! JUnit version 3.8 ou ultérieure attendue: "

206

Lorsque j'essaie d'exécuter le test suivant dans IntelliJ IDEA, j'obtiens le message:

"!!! JUnit version 3.8 ou ultérieure attendue:"

Il convient de noter qu'il s'agit d'un projet Android sur lequel je travaille dans 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 trace de pile complète ressemble à ceci ...

!!! 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
la source
Intellij 9, le dernier patch.
benstpierre
J'ai une solution ici stackoverflow.com/questions/29172698/…
voronnenok
Honnêtement, j'ai finalement essayé d'utiliser le plugin Android dans IntelliJ et j'ai mordu la balle et utilisé le dernier Android Studio. tout va bien
Kirby
Si quelqu'un d'autre est venu ici sans avoir "Test" dans le nom de sa classe de test; vous devez ajouter le frère "Test". Nommer votre classe "GameEngine" provoquerait la même erreur, vous pouvez le résoudre en le faisant "GameEngineTest". À votre santé!
recepinanc

Réponses:

364

Ce problème se produit car Android Platform ( android.jar) contient déjà des classes JUnit. Le testeur IDEA charge ces classes et voit qu'elles proviennent de l'ancien JUnit, tandis que vous essayez d'utiliser des tests annotés qui sont une fonctionnalité du nouveau JUnit, vous obtenez donc l'erreur du testeur.

La solution est simple, ouvrez le Project Structure| Modules| Dependencies, et déplacez-le junit-4.7.jarvers le haut, de sorte qu'il vienne avant Android 1.6 Platform dans le chemin de classe. Désormais, le testeur sera content de charger la nouvelle version de JUnit.

CrazyCoder
la source
9
Juste pour sensibiliser les gens, c'est toujours un problème avec les versions ultérieures d'Android.
Chris.Jenkins
a également résolu le problème dans maven en plaçant la dépendance fournie par Android après les dépendances de test
avianey
18
J'ai un projet Android Gradle qui utilise robolectric comme décrit ici: peterfriese.de/android-testing-with-robolectric et lorsque je déplace la plate-forme Android loin du 1er dans le chemin de classe , j'obtiens l'exception suivante:Class not found: "com.example.intellijgradletest.MainActivityTest"
Heath Borders
7
Dans IDEA 14.0.3 pour changer l'ordre des dépendances, vous devez utiliser les flèches. Le glisser-déposer ne fonctionne pas.
david.perez
4
Dans Android Studio, les fichiers de dépendances sont générés automatiquement. Il n'est donc pas possible de monter / descendre. Existe-t-il un autre moyen de résoudre ce problème?
iMDroid
35

entrez la description de l'image ici

mon module est un module de bibliothèque java, donc changer JRE en 1.8 java a résolu le problème.

Ou, vous pouvez également le faire globalement via Paramètres du module> Emplacement du SDK> JDK, en spécifiant le JDK 8 d'Oracle au lieu de la copie du SDK Android.

nutella_eater
la source
Cela fonctionne réellement et est également logique compte tenu du contexte du problème.
AgentKnopf
Dans mon cas, je devais changer JRE pour Junit par défaut
Rafael
Une autre façon: éditez votre jdk.table.xml sur ~/Library/Preferences/AndroidStudioX.X/options/jdk.table.xmlou C:\Users\Name\.AndroidStudioX.X\config\options\jdk.table.xmlsur Windows. Recherchez le nœud <name value="Android API 28 Platform" />et définissez-le <annotationsPath>sur <root url="jar://$USER_HOME$/Android-SDK/platforms/android-28/data/annotations.zip!/" type="simple" />. Assurez-vous également que le <classPath>nœud contient platforms/android-28/...dans les deux URL de chemin de fichier. Ajustez "Android-SDK" au nom de votre dossier.
Mr-IDE
Ça marche pour moi! Passez simplement de Default (Android API 28) à 1.8 (Java) et ça marche!
aiueoH
8

J'ai eu ce problème avec un projet multi-modules (libgdx). Un module est pur Java et a des tests. Ma solution a été de définir «utiliser JRE alternatif» sur «Java 1.8» dans la configuration d'exécution de mes tests unitaires. Cela garantit qu'aucun android.jar ne se trouve sur le chemin de classe et que le runner junit 4.x est utilisé.

Uwe Post
la source
Vous n'avez pas vraiment besoin d'utiliser 1.8. Il suffit de choisir 1.7 qui ne vient pas avec le SDK Android.
kingston
8

J'ai eu la même erreur lors de la création des deux Unit Testet Android Instrument Testdans Android Studio 1.4+ et cela a commencé à devenir confus. Pour éviter cette erreur Assurez - vous que votre classe de test est tomber sous Android TestsleRun/Debug Configurations

  1. Assurez-vous de suivre correctement les instructions https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
  2. Assurez - vous Test Artifacten Build Variantsest réglé surAndroid Instrumentation Tests
  3. Cliquez sur le menu Run>Edit Configuration
  4. Assurez-vous que le nom de votre classe / méthode est à l'intérieur Android Testsau lieu deJUnit
  5. Si c'est le cas, JUnitsupprimez simplement la configuration et faites un clic droit sur le fichier que vous souhaitez tester et Runencore. Il créera ensuite la configuration sous la Android Testssection et s'exécutera sur l'appareil / l'émulateur.
CallMeLaNN
la source
4
CECI A FONCTIONNÉ POUR MOI => S'il est dans JUnit, supprimez simplement la configuration et faites un clic droit sur le fichier que vous souhaitez tester et réexécuter. Il créera ensuite la configuration dans la section Tests Android et s'exécutera sur l'appareil / l'émulateur.
Devendra Vaja
A également fonctionné pour moi. J'ai exécuté le même test après l'avoir déplacé d'un testdossier à l'autre androidTest. Android Studio n'a pas mis à jour la configuration d'exécution après avoir fait cela
Daniil
5

Pour Android Studio - à partir d' Android Studio 1.1 Beta 4 , Google a ajouté la prise en charge du plug-in Android Gradle 1.1.0-RC . Le nouveau plugin prend en charge les tests unitaires via Android Studio à l'aide de junit 4+.

C'est encore expérimental et il y a quelques étapes manuelles pour le configurer.

ZahiC
la source
Cela fonctionne, mais Android Studio a toujours des problèmes avec les configurations de génération automatique pour les tests, donc à chaque fois que vous devez corriger la configuration en cours en resélectionnant le package de test. Sinon, NullPointerException pendant le test.
Alfishe
4

Pour tous ceux qui lisent ce post et qui ont toujours le même problème avec AndroidStudio 1.0. Vous ne pouvez pas modifier l'ordre des dépendances dans AndroidStudio, l'IDE les réécrit automatiquement. Et, même si vous parvenez à changer l'ordre en modifiant le fichier .iml, vous obtiendrez une "classe non trouvée ...". En effet, le chemin de sortie de test ne peut pas être défini sur AndroidStudio.

En fait, il existe une solution pour faire fonctionner AndroidStudio, Junit et Robolectric ensemble. Regarde ça https://github.com/JCAndKSolutions/android-unit-test et utilisez également ce plugin: https://github.com/evant/android-studio-unit-test-plugin

Fonctionne parfaitement pour moi.

rontho
la source
2

J'ai la même erreur lorsque j'ai créé mon propre package junit

entrez la description de l'image ici

Pour résoudre ce problème, j'ai ajouté ces deux lignes dans mon fichier de notes d'application comme il est expliqué ici :

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

Il y a deux choses que je pourrais imaginer arriver

  • Si votre IDE essaie de démarrer un test Android Junit qui s'exécute directement sur l'émulateur, vous ne pouvez pas utiliser Junit4.
  • Si vous avez accidentellement utilisé les classes junit fournies par le pot Android, elles ne peuvent pas fonctionner sur un jvm normal car il n'y a que de vraies classes compilées pour le dalvik vm android.
Janusz
la source
1

Cela m'est également arrivé dans Android Studio 1.1 - bien qu'il devrait prendre en charge les tests unitaires sans plug-in.

Sur d'autres machines (même projet, même version d'AS), j'ai constaté que lors de l'exécution de tests unitaires, l'EDI n'ajoute pas le fichier android.jar au chemin de classe, alors que sur ma machine, c'est le cas.

Ma meilleure supposition était qu'en raison de la conversion que nous avons faite de Maven en Gradle et du passage d'Intellij en AS, un cache de paramètres est resté quelque part dans ma machine, ce qui a entraîné l'ajout d'android.jar au chemin de classe.

Ce que j'ai fait est d'effacer tous les caches liés à Android de ma machine (sous le dossier c: \ users \ USRE_NAME): .android .AndroidStudio .gradle .m2

Après cela, j'ai rouvert le projet et les tests ont fonctionné.

J'essaie toujours de comprendre ce qui n'a pas fonctionné, mais cela devrait faire l'affaire pour l'instant.

Yossi Shmueli
la source
1

J'ai eu ce problème dans Android Studio 1.5, car je ne savais pas que je devais passer le paramètre "Test d'artefact" dans les "Build Variants" (coin inférieur gauche de la fenêtre principale) de "Android Instrumentation Tests" à "Unit Tests ". Lorsque vous le faites, vous pouvez voir un fichier ExampleUnitTest.java dans la fenêtre Projet.

ScarOnTheSky
la source
1

J'ai eu le même problème mais pour une autre raison. J'étais sur IntelliJ avec un projet java gradle régulier (pas android) mais le JDK était réglé sur le SDK Android dans Project Structure(était le JDK par défaut pour certaines raisons). C'est vraiment stupide mais IntelliJ n'était pas assez gentil pour m'indiquer ce qui ne va pas, alors je suis resté coincé là-dessus.

Hiver
la source
1

Voici comment je l'ai résolu:

Modifier les configurations -> Paramètres par défaut -> Android JUnit -> Ajoutez les éléments suivants au répertoire de travail:

$ MODULE_DIR $

liminal
la source
1

Pour moi, ce problème est dû à une configuration d'exécution obsolète / cassée pour les tests. J'ai simplement dû supprimer la configuration, puis en créer une nouvelle et le problème a été résolu.

Supprimer l'ancienne configuration de test

choquant
la source
0

Dans le projet Android que j'avais minifyEnabled = true, après l'avoir changé en falsetout fonctionnait.

Przemo
la source
0

Si vous supprimez

testOptions {
    unitTests.returnDefaultValues = true
}

de votre build.gradleça marchera

Chiara
la source
0

Allez dans Structure du projet -> Configuration de la plate-forme, changez les SDK en 1.8 pour résoudre mon problème.

Lin W
la source
0

J'étais également confronté au même problème, après avoir changé en build.gradle, cela fonctionne bien pour moi.

changez votre version junit dans build.gradle en:

    testImplementation 'junit:junit:3.8'
Abdul Rizwan
la source
0

J'ai suivi la réponse de CrazyCoder mais il n'y avait aucun fichier junit affiché dans les dépendances. alors j'en ai téléchargé un depuis http://www.java2s.com/Code/Jar/j/Downloadjunitjar.htm , puis je l'ai ajouté en appuyant sur le bouton plus à droite. Et ça a marché

Ayman Harake
la source
0

La désactivation de "Utiliser le JDK intégré" dans la structure du projet / l'emplacement du SDK est ce qui m'a aidé dans mon cas, mais je ne sais pas exactement pour quelle raison il a échoué en premier lieu.

Wojciech Sadurski
la source
0

Remplacez votre android.jar dans le dossier libs par le dernier. Vous pouvez le télécharger ici

DB377
la source
0

Dans AndroidStudio, Open Project Structure -> SDK Locationvous pouvez voir l' JDKemplacement, changer l'utilisation de "Utiliser le JDK intégré" à votre propre JDKdemande, puis revenir à "Utiliser le JDK intégré" , c'est peut-être du travail

CrazyLiu
la source
0

Dans mon cas, le changement JREde Run Configurationsdose résout le problème, mais lorsque je clique sur le bouton Exécuter à côté de la fonction de test, les JREoptions seront réinitialisées par défaut.

Enfin, similaire à la réponse de @CrazyLiu, dans Project Structure - SDK Location - JDK, sélectionnez Embedded JDK. Parce qu'il n'y a pas de case à cocher dans Android Studio 3.6.

Chenhe
la source
0

J'ai reçu le même message

JUnit version 3.8 or later expected

par une simple erreur de débutant. J'avais utilisé les mêmes noms de package et noms de classe sur src / main et src / test pour une classe (la classe HomeController dans mon cas):

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!

Avec cela, la classe src / main HomeController, ainsi que la classe src / test HomeController, avaient le même chemin complet:

com.example.controller.HomeController.class

Résultat: tous les tests qui dépendaient de la classe HomeController ont échoué.

La modification du nom du package et / ou du nom de la classe a résolu le problème. Voici l'exemple, lorsque les deux, le nom du package et le nom de la classe sont modifiés:

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

Maintenant, les noms de classe pleinement qualifiés diffèrent. Le nom de la classe src / main HomeController est:

com.example.controller.HomeController.class

et le nom de la classe src / test HomeHontrollerTest est:

com.example.test.controller.HomeControllerTest.class

Les noms de classe qualifiés étant uniques, le problème disparaît.

Olli
la source