Impossible de résoudre le symbole "AndroidJUnit4"

139

De toute évidence, j'ai besoin de la déclaration d'importation correcte pour résoudre ce problème. Selon la documentation pourAndroidJUnit4 , cela devrait être

import android.support.test.runner.AndroidJUnit4;

Lorsque je fais cela, Android Studio est mis runneren évidence en rouge et se plaint "Impossible de résoudre le symbole" runner "".

Contexte

Je suis arrivé à ce point en suivant les tutoriels sur le site Android Developer pour configurer des tests à l'aide de UI Automator . Le premier problème que j'ai rencontré était cela com.android.support:support-v4:22.2.0et com.android.support.test:runner:0.2dépendait de différentes versions de com.android.support:support-annotations. J'ai suivi les suggestions de ce rapport de bogue Android et ajouté ce qui suit allprojectsdans mon projet build.gradle:

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}

Cela a résolu l'erreur immédiate, mais je soupçonne que cela a conduit à mes problèmes actuels. Quelqu'un a-t-il des suggestions sur la façon de résoudre ce problème?

Relevent sections de `./gradlew: app: dependencies

androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.jayway.android.robotium:robotium-solo:5.2.1
+--- com.squareup:fest-android:1.0.8
|    \--- org.easytesting:fest-assert-core:2.0M10
|         \--- org.easytesting:fest-util:1.2.5
+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0 -> 22.2.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.uiautomator:uiautomator-v18:2.1.0

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.2.0
|    \--- com.android.support:support-v4:22.2.0
|         \--- com.android.support:support-annotations:22.2.0
+--- com.android.support:support-v4:22.2.0 (*)
+--- com.google.android.gms:play-services:6.1.71
|    \--- com.android.support:support-v4:20.0.0 -> 22.2.0 (*)
+--- com.crashlytics.android:crashlytics:1.+ -> 1.1.13
\--- com.jakewharton:butterknife:5.1.2
Code-Apprenti
la source
Cela suggère que votre build est com.android.support.test:runnercarrément absent . Pouvez-vous confirmer via gradle dependenciesque vous tirez toujours cela après le resolutionStrategychangement?
CommonsWare
@CommonsWare Ajout de la sortie des dépendances à ma question. Je ne sais pas ce que ça (*)veut dire après com.android.support.test:runner:0.2.
Code-Apprentice
Selon les gens de Gradle , l'astérisque "signifie que l'arborescence du graphique de dépendances est raccourcie à ce stade car cette partie du graphique était déjà répertoriée plus tôt." Je ne comprends pas pourquoi cela ne fonctionne pas pour vous.
CommonsWare
1
Notez que la réponse de @stemadsen de 2018 est potentiellement plus pertinente que les autres. Quelqu'un a écrit une fois sur un test qui gardait les questions la même année après année, mais les réponses ont changé ...
Roy Falk

Réponses:

199

Assurez-vous que votre application est dans la variante de version de débogage. Accédez à Build> Select Build Variant ... et ce qui suit devrait apparaître:

entrez la description de l'image ici

orium
la source
5
Merci, vous m'avez sauvé
Canapé
10
Soyez bénis. La documentation ne déclare jamais "ce truc ne fonctionnera qu'en débogage". Si frustrant.
Chantell Osejo
27
Sensationnel. Vote positif x 1 million. C'est la réponse que je cherchais depuis des jours. J'ai également trouvé ceci afin que vous puissiez changer le type de construction à utiliser. android { testBuildType "staging"}
WIllJBD
5
Je vais devoir déposer un rapport de bogue pour cela avec l'équipe Android Studio Tools. Même les types de build qui héritent de debugne fonctionnent pas à moins qu'ils ne soient explicitement définis sur "debug"
Gautham C.
1
wow, j'utilise un buildType cutom avec initWith (buildTypes.debug) et échoue toujours. Seulement et seulement si j'utilise le débogage fonctionne directement!
Karoly
120

J'ai fait l'erreur de mettre les classes de test à src / test . Après les avoir déplacés vers src / androidTest / java /, la dépendance a été résolue.

micros
la source
Dans mon cas, mon dossier de test était src / test pour une raison quelconque, puis j'ai dû le renommer en src / androidTest et cela a résolu mon problème, après 3 heures ...
Teo Inke
69

Ok alors voici votre erreur et la mienne!

Si nous voulons écrire une partie de code pour les tests unitaires locaux, nous ne devrions pas utiliser @RunWith(AndroidJUnit4.class)car nous n'utilisons pas AndroidJUnit4 mais nous avons besoin de Junit4. nous devrions donc écrire @RunWith(JUnit4.class). Et bien sûr, votre fichier de test java se trouve sous le app/src/test/java/your.package.namerépertoire.

Sinon, si (!!) nous voulons écrire un test unitaire instrumenté Android, nous devrions mettre nos fichiers java de test dans le app/src/androidTest/java/your.package.namerépertoire et utiliser une annotation comme@RunWith(AndroidJUnit4.class)

Sepehr Behroozi
la source
J'utilise Maven, et alors?
JohnyTex
2
@JohnyTex L'utilisation de Maven n'affecte pas ma réponse. Cela dépend uniquement de la structure des fichiers de votre projet.
Sepehr Behroozi
34

Mettre à jour

La bibliothèque de tests Android fait désormais partie d'AndroidX. Assurez-vous d'utiliser les dépendances Gradle correctes trouvées dans la documentation officielle .

Réponse originale

J'ai trouvé ici qu'il existe des versions plus récentes de la bibliothèque de support de test que ce que j'utilisais:

dependencies {
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

Remarque: veillez à utiliser les versions les plus récentes de ces bibliothèques. Cette question remonte à une époque où la bibliothèque de support de test Android était nouvelle et les numéros de version ici sont très obsolètes.

Code-Apprenti
la source
3
Je me demande pourquoi la documentation ne mentionne rien à ce sujet, sauf si je l'ai manqué. M'aurait sauvé du chagrin.
Nom1fan
@Karoly j'ai encore des problèmes. Avez-vous trouvé une solution?
Mahdi
26

J'ai résolu le problème en apportant une petite modification au fichier build.gradle de l'application. Dans la dependencies { ... }section, assurez-vous d'inclure la ligne suivante:

debugImplementation 'com.android.support.test:runner:1.0.1'

ou quelle que soit la version la plus récente à ce stade ( ...Compileest obsolète et a été remplacée par ...Implementation). Notez l'utilisation de debugImplementation. Android Studio a suggéré de l'inclure automatiquement avec androidTestImplementation, ce qui n'a pas fonctionné.

J'ai découvert comment le changer de test en débogage en regardant dans Structure du projet sous Dépendances du module d'application, où vous pouvez modifier la portée de chaque dépendance, voir ci-dessous.

Structure du projet

Stemadsen
la source
Notez que cela compilera la bibliothèque de support de test dans l'APK.
Code-Apprentice
Fonctionne également avec testImplementation "com.android.support.test: rules: 1.0.2"
Prat
10

Notez que l'OP est maintenant en 2019, âgé de 4 ans, donc si vous utilisez Android X, il AndroidJUnit4.classest obsolète, vous avez une erreur là-bas et une autre avec ceci androidx.test.ext.junit.runners.AndroidJUnit4. Je suggère de lire ces liens pour résoudre le problème.

AndroidJUnit4.class est obsolète: comment utiliser androidx.test.ext.junit.runners.AndroidJUnit4?

Migration des tests Junit4 vers androidx: quelles sont les causes du "délégué runner n'a pas pu être chargé"? Pour moi, Android Studio a suggéré de remplacer

@RunWith(AndroidJUnit4.class)

qui était obsolète avec

@RunWith(AndroidJUnit4ClassRunner.class)

et ça

androidx.test.ext.junit.runners.AndroidJUnit4

avec ça

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;

Après cela, l'erreur a disparu mais je ne sais pas si le futur test en cours d'exécution est correct?!

leonidaa
la source
@ Code-Apprentice - Merci beaucoup pour l'édition, c'est beaucoup mieux maintenant
leonidaa
8

Dans mon cas, cela a aidé pour la variante de publication:

android {
    ...
    testBuildType "release" 
}
Andrew Glukhoff
la source
Pouvez-vous donner une solution plus complète. Je ne comprends pas le contexte de ce que vous avez fait.
Code-Apprentice
J'ai rencontré un problème "Impossible de résoudre le symbole 'AndroidJUnit4'" sur mon test d'espresso lorsque j'ai changé la variante de construction en "release". Dès que j'ai ajouté cette déclaration (testBuildType "release") à build.gradle au niveau de l'application (extrait de developer.android.com/studio/test/index.html#add_a_new_test ), ce problème a disparu.
Andrew Glukhoff
J'ai formaté votre réponse avec le code de votre réponse. Vous devriez ajouter plus de détails, tels que le lien de votre commentaire et décrire où ce bloc va dans votre projet.
Code-Apprentice
7

La cause commune de ce problème est que lors de l'ajout de la dépendance ci-dessous:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

C'est une dépendance correcte si vous allez utiliser des tests instrumentés (tests dans le androidTestpackage java)

Mais pour implémenter des tests unitaires locaux (tests dans le testpackage java) tout en utilisant la dépendance mentionnée ci-dessus; alors tu feras faceCannot resolve symbol 'AndroidJUnit4'

En effet, la androidTestImplementationdirective est utilisée pour importer des bibliothèques dans les tests instrumentés, mais pas dans les tests unitaires / JVM locaux.

Si vous souhaitez utiliser AndroidJUnit4dans un test JVM / unitaire local, utilisez plutôt la dépendance ci-dessous

testImplementation 'androidx.test.ext:junit:1.1.1'

La même chose s'applique si vous ajoutez cette dernière dépendance lors de l'utilisation AndroidJUnit4dans un test instrumenté, vous obtiendrez également Cannot resolve symbol 'AndroidJUnit4'; parce que vous utilisez la mauvaise directive.

Zain
la source
1
Dans le scénario de ma question initiale, j'exécutais des tests instrumentés. Cependant, c'est une grande distinction à faire et, espérons-le, aidera les visiteurs à résoudre cette question à l'avenir.
Code-Apprentice
5

Si quelqu'un a toujours ce problème:

Impossible de résoudre le symbole "AndroidJUnit4"

et à l'aide de l'API 27, dans le build.gradlemodule qui se trouve dans l'application, ajoutez les lignes suivantes:

testImplementation 'junit:junit:4.12'

// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'

// Espresso dependencies
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
tm81
la source
3

mettez ce code dans vos dépendances

compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
Paramatma Sharan
la source
1
Quand j'ai écrit cette question, je n'avais pas encore ajouté l'espresso comme dépendance pour les tests unitaires.
Code-Apprentice
+1 En fait, je l'ai compris juste avant de voir cela, mais oui, c'est ce que j'ai fait et cela a résolu mon problème.
Tony D
2
Suivez les deux réponses ci-dessous de @sepehr. La classe AndroidJunit4 n'est pas dans le package espresso installé dans le package android.support.test.runner. et tout ce que vous avez à faire est d'inclure @Runwith (AndroidJunit4.class) est écrit ci-dessus / pour le cas de test présent dans src / Androidtest / java, INSTED OF y compris dans les cas de test écrits sous src / test / java.
Khay
2

Si vous utilisez un projet avec plusieurs types de construction, le type de construction sélectionné dans la fenêtre de variante de construction doit être mentionné avec la balise testBuildType dans le fichier build.gradle du module.

Par exemple: si vous utilisez le débogage de type build, vous devez ajouter android{testBuildType "debug" }, si vous utilisez stage, ajoutez une android{testBuildType "stage"}instruction dans la balise android.

Rahul Rastogi
la source
Proposez-vous de modifier le fichier de construction si vous souhaitez changer la variante testée?
nasch
2

Déplacez la classe de test vers src / androidTest / java /. Ensuite, la dépendance se résoudra.

Komal Nikhare
la source
Lol ... vraiment ...
Manish Kumar Sharma
1

Le classique Invalidate Caches / Restart m'a aidé! :)

user_MGU
la source
1

Ajoutez cette dépendance dans votre fichier build.gradle:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

Mettez à jour la version finale ( 1.1.1) avec la dernière version publiée.

KOUSHIKZEP99
la source
0

Ajouter

compile com.android.support.test:runner:0.5'

résolu ce problème exact pour moi.

Donlys
la source
Ceci est déjà indiqué dans la réponse acceptée. Vous devriez également voir s'il existe une version plus récente et l'utiliser à la place.
Code-Apprentice
AndroidTestCompile est-il identique à compile?
donlys
compileles dépendances de noms de directives utilisées dans l'application principale tandis que les androidTestComipledépendances de noms utilisées pour les tests. Donc, la bonne réponse est d'utiliser androidTestCompile, non compile.
Code-Apprentice
0

Comme le montre la liste des réponses, cela peut être dû à plusieurs facteurs. Un de plus pour la liste:

J'ai exécuté un LINT trop zélé qui a supprimé toutes les importations inutilisées. Cela produira les mêmes erreurs, et il est facile de rater que c'est là le problème.

Android-studio mettra en évidence les références qui manquent dans le code de test - et la fenêtre contextuelle ALT-ENTER apparaîtra (c'est le bit qui est facile à manquer).

Ensuite, je dois supprimer les tests de LINT - ou au moins désactiver cet avertissement.

Edit: @ Code-Apprentice, les lignes manquantes étaient:

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;


import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

Donc, la première erreur dans le fichier était @RunWith(AndroidJUnit4.class)au début de ma classe de test.

winwaed
la source
Pouvez-vous montrer un exemple de test où cela s'est produit pour vous?
Code-Apprentice
0

Version courte histoire:

Mettez à niveau votre Gradle vers la dernière version

Je réponds à cette question le 15 février 2020. Malheureusement, j'ai épuisé toutes les solutions possibles mentionnées ici et ailleurs.

Oui, aucun d'entre eux ci-dessus ne fonctionne. J'utilise la fonction intégrée "Migrer vers Andoridx", cela peut me rappeler que je dois mettre à jour mes versions cibles du SDK et ma version gradle. Après avoir mis à niveau ma version gradle de 2.0.2 à 3.5.3. Ils fonctionnent juste, même l'ancienne déclaration d'importation fonctionne.

Bryan Zhang
la source
Bonjour, c'est une vieille question qui a déjà une réponse acceptée et je ne vois pas comment votre réponse ajoute quelque chose de nouveau à la question. Veuillez éviter de répondre si votre réponse n'ajoute rien de nouveau aux réponses existantes. Merci
hippozhipos
La réponse acceptée donne un lien pour mettre à jour les dépendances de test vers la bibliothèque de test AndroidX. C'est probablement la chose qui l'a corrigé dans toutes les choses que vous avez essayées.
Code-Apprentice le
0

La même erreur m'est apparue lorsque je suis l'application Google IOSched et que j'ai configuré mon projet avec trois types de build [débogage, publication, préparation] où débogage et publication partagent le même répertoire source

sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

Dans ce cas, spécifiez le testBuildTypedans votre fichier build.gradle au niveau du module et le projet devrait maintenant être en mesure de résoudre le symbole 'AndroidJUnit4'.

...
sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

testBuildType "staging"
...

Référence: https://github.com/google/iosched/blob/master/mobile/build.gradle

Jie Heng
la source