Das Symbol 'AndroidJUnit4' kann nicht aufgelöst werden.

139

Natürlich brauche ich die richtige Importanweisung, um dieses Problem zu lösen. Laut den Dokumenten fürAndroidJUnit4 sollte dies sein

import android.support.test.runner.AndroidJUnit4;

Wenn ich das mache, hebt Android Studio runnerrot hervor und beschwert sich "Symbol 'Läufer' kann nicht aufgelöst werden".

Hintergrund

Ich kam zu diesem Punkt, indem ich den Tutorials auf der Android Developer-Website zum Einrichten von Tests mit UI Automator folgte . Das erste Problem, auf das ich gestoßen bin, war das com.android.support:support-v4:22.2.0und com.android.support.test:runner:0.2hängt von verschiedenen Versionen von ab com.android.support:support-annotations. Ich folgte den Vorschlägen aus diesem Android-Fehlerbericht und fügte allprojectsin meinem Projekt Folgendes hinzu build.gradle:

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

Dies löste den sofortigen Fehler, aber ich vermute, dass dies zu meinen aktuellen Problemen führte. Hat jemand Vorschläge, wie dies behoben werden kann?

Relevent Abschnitte aus `./gradlew: app: Abhängigkeiten

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-Lehrling
quelle
Das deutet darauf hin, dass Ihr Build com.android.support.test:runnervöllig fehlt . Können Sie bestätigen, gradle dependenciesdass Sie dies nach der resolutionStrategyÄnderung noch tun ?
CommonsWare
@CommonsWare Abhängigkeitsausgabe zu meiner Frage hinzugefügt. Ich weiß nicht, was das danach (*)bedeutet com.android.support.test:runner:0.2.
Code-Apprentice
Laut den Gradle-Leuten bedeutet das Sternchen ", dass die Baumansicht des Abhängigkeitsdiagramms an dieser Stelle gekürzt wird, weil dieser Teil des Diagramms bereits früher aufgeführt wurde." Ich bin ratlos, warum das bei Ihnen nicht funktioniert.
CommonsWare
1
Beachten Sie, dass die Antwort von @stemadsen aus dem Jahr 2018 möglicherweise relevanter ist als die anderen. Jemand schrieb einmal über einen Test, bei dem die Fragen Jahr für Jahr gleich blieben, aber die Antworten änderten sich ...
Roy Falk

Antworten:

196

Stellen Sie sicher, dass sich Ihre App in der Debug-Build-Variante befindet. Gehen Sie zu Build> Select Build Variant ... und Folgendes sollte angezeigt werden:

Geben Sie hier die Bildbeschreibung ein

Orium
quelle
4
Danke, du hast mich gerettet
Sofa
9
Gesundheit. In der Dokumentation heißt es nie, dass "dieses Zeug nur beim Debuggen funktioniert". So frustrierend.
Chantell Osejo
25
Beeindruckend. Up-Vote x 1 Million. Dies ist die Antwort, nach der ich seit Tagen gesucht habe. Dies wurde auch gefunden, damit Sie ändern können, welcher Build-Typ dafür verwendet werden soll. android { testBuildType "staging"}
WIllJBD
5
Ich muss dafür einen Fehlerbericht beim Android Studio Tools-Team einreichen. Sogar Build-Typen, die von erben debug, funktionieren nur, wenn sie explizit auf "debuggen" gesetzt sind
Gautham C.
1
Wow, ich verwende einen Cutsom BuildType mit initWith (buildTypes.debug) und schlägt immer noch fehl. Nur und nur wenn ich das Debug direkt benutze, funktioniert es!
Karoly
119

Ich habe den Fehler gemacht, die Testklassen auf src / test zu setzen . Nach dem Verschieben nach src / androidTest / java / wurde die Abhängigkeit aufgelöst.

Mikrofone
quelle
In meinem Fall war mein Testordner aus irgendeinem Grund src / test, dann musste ich ihn in src / androidTest umbenennen und es löste mein Problem nach 3 Stunden ...
Teo Inke
69

Ok, hier ist dein und mein Fehler!

Wenn wir ein Stück Code für Local Unit Testing schreiben wollen, sollten @RunWith(AndroidJUnit4.class)wir es nicht verwenden, da wir nicht AndroidJUnit4 verwenden, sondern Junit4. also sollten wir schreiben @RunWith(JUnit4.class). Und natürlich befindet sich Ihre Java-Testdatei im app/src/test/java/your.package.nameVerzeichnis.

Andernfalls, wenn (!!) wir einen Android Instrumented Unit Test schreiben möchten, sollten wir unsere Test-Java-Dateien in ein app/src/androidTest/java/your.package.nameVerzeichnis stellen und Anmerkungen wie verwenden@RunWith(AndroidJUnit4.class)

Sepehr Behroozi
quelle
Ich benutze Maven, was dann?
JohnyTex
2
@ JohnyTex Die Verwendung von Maven hat keinen Einfluss auf meine Antwort. Dies hängt nur von Ihrer Projektdateistruktur ab.
Sepehr Behroozi
34

Aktualisieren

Die Android-Testbibliothek ist jetzt Teil von AndroidX. Stellen Sie sicher, dass Sie die richtigen Gradle-Abhängigkeiten verwenden, die in der offiziellen Dokumentation enthalten sind .

Ursprüngliche Antwort

Ich habe hier festgestellt , dass es neuere Versionen der Testing Support Library gibt als die, die ich verwendet habe:

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'
}

Hinweis: Verwenden Sie unbedingt die neuesten Versionen dieser Bibliotheken. Diese Frage stammt aus einer Zeit, als die Android Test Support Library neu war und die Versionsnummern hier sehr veraltet sind.

Code-Lehrling
quelle
3
Ich frage mich, warum in der Dokumentation nichts darüber erwähnt wird , es sei denn, ich habe es verpasst. Hätte mir etwas Kummer erspart.
Nom1fan
@ Karoly Ich habe immer noch ein Problem. Haben Sie eine Lösung gefunden?
Mahdi
26

Ich habe das Problem gelöst, indem ich eine kleine Änderung in der build.gradle-Datei der App vorgenommen habe. dependencies { ... }Stellen Sie sicher, dass in diesem Abschnitt die folgende Zeile enthalten ist:

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

oder welche Version zu diesem Zeitpunkt die neueste ist ( ...Compileist veraltet und wurde durch ersetzt ...Implementation). Beachten Sie die Verwendung von debugImplementation. Android Studio schlug vor, es automatisch einzuschließen androidTestImplementation, was nicht funktionierte.

Ich habe herausgefunden, wie man es vom Test zum Debuggen ändert, indem ich in Projektstruktur unter Abhängigkeiten des App-Moduls nachgesehen habe, wo Sie den Umfang jeder Abhängigkeit ändern können (siehe unten).

Projektstruktur

stemadsen
quelle
Beachten Sie, dass dadurch die Testunterstützungsbibliothek in das APK kompiliert wird.
Code-Apprentice
Funktioniert auch mit testImplementation "com.android.support.test: rules: 1.0.2"
Prat
10

Beachten Sie, dass das OP jetzt im Jahr 2019 4 Jahre alt ist. Wenn Sie Android X verwenden, AndroidJUnit4.classist es veraltet. Dort und dort ist ein Fehler aufgetreten androidx.test.ext.junit.runners.AndroidJUnit4. Ich schlage vor, diese Links zu lesen, um das Problem zu lösen.

AndroidJUnit4.class ist veraltet: Wie verwende ich androidx.test.ext.junit.runners.AndroidJUnit4?

Junit4-Tests nach AndroidX migrieren: Was verursacht, dass der Delegate Runner nicht geladen werden konnte? Für mich schlug Android Studio vor, zu ersetzen

@RunWith(AndroidJUnit4.class)

was mit veraltet war

@RunWith(AndroidJUnit4ClassRunner.class)

und das

androidx.test.ext.junit.runners.AndroidJUnit4

mit diesem

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

Danach ist der Fehler verschwunden, aber ich weiß nicht, ob der zukünftige Test in Ordnung ist ?!

leonidaa
quelle
@ Code-Apprentice - Vielen Dank für die Bearbeitung, es ist jetzt viel schöner
Leonidaa
8

In meinem Fall hat dies für die Release-Variante geholfen:

android {
    ...
    testBuildType "release" 
}
Andrew Glukhoff
quelle
Können Sie eine vollständigere Lösung geben? Ich verstehe den Kontext von dem, was du getan hast, nicht.
Code-Lehrling
Bei meinem Espressotest ist das Problem "Symbol 'AndroidJUnit4' kann nicht behoben werden" aufgetreten, als ich die Build-Variante in "Release" geändert habe. Sobald ich diese Anweisung (testBuildType "release") zu build.gradle auf App-Ebene hinzugefügt habe (entnommen aus developer.android.com/studio/test/index.html#add_a_new_test ), verschwand dieses Problem.
Andrew Glukhoff
Ich habe Ihre Antwort mit dem Code in Ihrer Antwort formatiert. Sie sollten weitere Details hinzufügen, z. B. den Link aus Ihrem Kommentar, und beschreiben, wohin dieser Block in Ihrem Projekt führt.
Code-Apprentice
7

Die häufigste Ursache für dieses Problem ist, dass beim Hinzufügen der folgenden Abhängigkeit:

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

Dies ist eine korrekte Abhängigkeit, wenn Sie instrumentierte Tests verwenden möchten (Tests im androidTestJava-Paket).

Aber zum Implementieren lokaler Komponententests (Tests im testJava-Paket) unter Verwendung der oben genannten Abhängigkeit; dann wirst du dich stellenCannot resolve symbol 'AndroidJUnit4'

Dies liegt daran, dass die androidTestImplementationDirektive zum Importieren von Bibliotheken in instrumentierten Tests verwendet wird, nicht jedoch in lokalen JVM- / Komponententests.

Wenn Sie AndroidJUnit4in einem lokalen JVM / Unit-Test verwenden möchten, verwenden Sie stattdessen die folgende Abhängigkeit

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

Das Gleiche gilt, wenn Sie die letztere Abhängigkeit hinzufügen, während Sie sie AndroidJUnit4im instrumentierten Test verwenden Cannot resolve symbol 'AndroidJUnit4'. weil Sie die falsche Anweisung verwenden.

Zain
quelle
1
In dem Szenario in meiner ursprünglichen Frage habe ich instrumentierte Tests durchgeführt. Dies ist jedoch eine große Unterscheidung und wird den Besuchern hoffentlich in Zukunft bei dieser Frage helfen.
Code-Apprentice
5

Wenn noch jemand dieses Problem hat:

Das Symbol 'AndroidJUnit4' kann nicht aufgelöst werden.

Fügen Sie unter Verwendung von API 27 im build.gradleApp-Modul die folgenden Zeilen hinzu:

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
quelle
3

Fügen Sie diesen Code in Ihre Abhängigkeiten ein

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
quelle
1
Als ich diese Frage schrieb, hatte ich noch keinen Espresso als Abhängigkeit für Unit-Tests hinzugefügt.
Code-Lehrling
+1 Ich habe es tatsächlich herausgefunden, kurz bevor ich das gesehen habe, aber ja, das habe ich getan und es hat mein Problem gelöst.
Tony D
2
Folgen Sie den beiden folgenden Antworten von @sepehr. Die AndroidJunit4-Klasse ist nicht im Espresso-Paket enthalten, sondern im android.support.test.runner-Paket. und alles, was Sie tun müssen, ist einzuschließen, dass @Runwith (AndroidJunit4.class) oben / für Testfälle in src / Androidtest / java geschrieben wird, INSTED OF in Testfällen, die unter src / test / java geschrieben sind.
Khay
2

Wenn Sie ein Projekt mit mehreren Build-Typen verwenden, muss der ausgewählte Build-Typ im Build-Varianten-Fenster mit dem Tag testBuildType in der build.gradle-Datei des Moduls angegeben werden.

Zum Beispiel: Wenn Sie ein Debug vom Typ Build verwenden , sollten Sie hinzufügen android{testBuildType "debug" }, wenn Sie Stage verwenden, fügen Sie eine android{testBuildType "stage"}Anweisung im Android-Tag hinzu.

Rahul Rastogi
quelle
Schlagen Sie vor, die Build-Datei zu bearbeiten, wenn Sie die zu testende Variante wechseln möchten?
Nasch
2

Verschieben Sie die Testklasse nach src / androidTest / java /. Dann wird die Abhängigkeit aufgelöst.

Komal Nikhare
quelle
Lol ... wirklich ...
Manish Kumar Sharma
1

Der klassische Invalidate Caches / Restart hat mir geholfen! :) :)

user_MGU
quelle
1

Fügen Sie diese Abhängigkeit in Ihre build.gradle-Datei ein:

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

Aktualisieren Sie die Endversion ( 1.1.1) mit der neuesten veröffentlichten Version.

KOUSHIKZEP99
quelle
0

Hinzufügen

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

genau dieses Problem für mich gelöst.

Donlys
quelle
Dies ist bereits in der akzeptierten Antwort angegeben. Sie sollten auch sehen, ob es eine neuere Version gibt, und diese stattdessen verwenden.
Code-Apprentice
Ist androidTestCompile dasselbe wie compile?
Donlys
compileDirektiven benennen Abhängigkeiten, die in der Haupt-App verwendet werden, während Namensabhängigkeiten androidTestComiplezum Testen verwendet werden. Die richtige Antwort ist also androidTestCompile, nicht zu verwenden compile.
Code-Apprentice
0

Wie die Liste der Antworten zeigt, kann dies durch einige Dinge verursacht werden. Noch eine für die Liste:

Ich habe einen übereifrigen LINT ausgeführt, der alle nicht verwendeten Importe entfernt hat. Dies führt zu denselben Fehlern, und es ist leicht zu übersehen, dass dies das Problem ist.

Android-Studio hebt Referenzen hervor, die im Testcode fehlen - und das ALT-ENTER-Popup wird angezeigt (dies ist das Bit, das leicht zu übersehen ist).

Als nächstes muss ich die Tests aus LINT entfernen - oder zumindest diese Warnung deaktivieren.

Edit: @ Code-Apprentice, die fehlenden Zeilen waren:

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;

Der erste Fehler in der Datei war also @RunWith(AndroidJUnit4.class)zu Beginn meiner Testklasse.

winwaed
quelle
Können Sie einen Beispieltest zeigen, bei dem dies für Sie passiert ist?
Code-Apprentice
0

Kurzgeschichtenversion:

Aktualisieren Sie Ihren Gradle auf die neueste Version

Ich beantworte diesen Fragenbeitrag am 15. Februar 2020. Leider habe ich alle hier und anderswo genannten möglichen Lösungen ausgeschöpft.

Ja, keiner von ihnen funktioniert. Ich verwende die integrierte Funktion "Zu Andoridx migrieren". Sie erinnert mich möglicherweise daran, dass ich meine Ziel-SDK-Versionen und meine Gradle-Version aktualisieren muss. Nachdem ich meine Gradle-Version von 2.0.2 auf 3.5.3 aktualisiert habe. Sie funktionieren einfach, sogar die alte Importanweisung funktioniert.

Bryan Zhang
quelle
Hallo, dies ist eine alte Frage, die bereits akzeptiert wurde, und ich sehe nicht, wie Ihre Antwort der Frage etwas Neues hinzufügt. Bitte vermeiden Sie Antworten, wenn Ihre Antwort den vorhandenen Antworten nichts Neues hinzufügt. Danke
Hippozhipos
Die akzeptierte Antwort enthält einen Link zum Aktualisieren der Testabhängigkeiten in der AndroidX-Testbibliothek. Dies ist wahrscheinlich die Sache, die es in all den Dingen behoben hat, die Sie versucht haben.
Code-Apprentice
0

Der gleiche Fehler trat mir auf, als ich der Google IOSched-App folgte und mein Projekt mit drei Build-Typen [Debug, Release, Staging] einrichtete, bei denen Debug und Release dasselbe Quellverzeichnis verwenden

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

testBuildTypeGeben Sie in diesem Fall die Datei build.gradle auf Modulebene an. Das Projekt sollte nun in der Lage sein, das Symbol 'AndroidJUnit4' aufzulösen.

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

testBuildType "staging"
...

Referenz: https://github.com/google/iosched/blob/master/mobile/build.gradle

Jie Heng
quelle