Nie można rozwiązać symbolu „AndroidJUnit4”

139

Oczywiście potrzebuję prawidłowej instrukcji importu, aby rozwiązać ten problem. Zgodnie z dokumentacjąAndroidJUnit4 , tak powinno być

import android.support.test.runner.AndroidJUnit4;

Kiedy to robię, Android Studio podświetla się runnerna czerwono i narzeka „Nie można rozwiązać problemu z symbolem„ biegacz ””.

tło

Dotarłem do tego punktu, postępując zgodnie z samouczkami w witrynie Android Developer, aby skonfigurować testy za pomocą UI Automator . Pierwszym problemem, który napotkałem, było to com.android.support:support-v4:22.2.0i com.android.support.test:runner:0.2zależało od różnych wersji com.android.support:support-annotations. Postępowałem zgodnie z sugestiami z tego raportu o błędzie Androida i dodałem następujące elementy do allprojectsmojego projektu build.gradle:

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

To rozwiązało natychmiastowy błąd, ale podejrzewam, że doprowadziło to do moich obecnych problemów. Czy ktoś ma jakieś sugestie, jak to naprawić?

Odpowiednie sekcje z `./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-Apprentice
źródło
To sugeruje, że brakuje Twojej kompilacji com.android.support.test:runner. Czy możesz potwierdzić gradle dependencies, że po resolutionStrategyzmianie nadal to robisz ?
CommonsWare
@CommonsWare Dodano dane wyjściowe zależności do mojego pytania. Nie wiem, co to (*)oznacza później com.android.support.test:runner:0.2.
Code-Apprentice
Według ludzi z Gradle gwiazdka „oznacza, że ​​widok drzewa wykresu zależności jest w tym momencie skrócony, ponieważ ta część wykresu była już wcześniej wymieniona”. Jestem zdumiony, dlaczego to nie działa dla ciebie.
CommonsWare
1
Zwróć uwagę, że odpowiedź @stemadsen z 2018 roku jest potencjalnie bardziej istotna niż inne. Ktoś kiedyś napisał o teście, w którym pytania były takie same rok po roku, ale odpowiedzi się zmieniły ...
Roy Falk

Odpowiedzi:

199

Upewnij się, że Twoja aplikacja jest w wariancie kompilacji do debugowania. Idź do Build> Select Build Variant ... i powinno pojawić się:

wprowadź opis obrazu tutaj

orium
źródło
5
Dzięki, uratowałeś mnie
Sofa
10
Na zdrowie. Dokumentacja nigdy nie stwierdza, że ​​„te rzeczy będą działać tylko podczas debugowania”. Bardzo frustrujące.
Chantell Osejo
27
Łał. Głos pozytywny x 1 milion. To jest odpowiedź, której szukałem od wielu dni. Znalazłem również to, abyś mógł zmienić typ kompilacji, którego chcesz użyć. android { testBuildType "staging"}
WIllJBD
5
Będę musiał zgłosić błąd w tej sprawie do zespołu Android Studio Tools. Nawet typy kompilacji, które dziedziczą po debug, nie działają, chyba że są wyraźnie ustawione na „debugowanie”
Gautham C.
1
wow, używam cutom buildType z initWith (buildTypes.debug) i nadal nie działa. Tylko i tylko wtedy, gdy używam debugowania bezpośrednio, działa!
Karoly
120

Popełniłem błąd, umieszczając klasy testowe w src / test . Po przeniesieniu ich do src / androidTest / java / zależność została rozwiązana.

mikrofony
źródło
W moim przypadku moim folderem testowym był z jakiegoś powodu src / test, potem musiałem zmienić jego nazwę na src / androidTest i to rozwiązało mój problem po 3 godzinach ...
Teo Inke
69

Ok, więc oto twój błąd i mój!

Jeśli mamy zamiar napisać fragment kodu do lokalnego testowania jednostkowego, nie powinniśmy używać, @RunWith(AndroidJUnit4.class)ponieważ nie używamy AndroidJUnit4, ale potrzebujemy Junit4. więc powinniśmy napisać @RunWith(JUnit4.class). I oczywiście twój plik testowy java znajduje się w app/src/test/java/your.package.namekatalogu.

W przeciwnym razie, jeśli (!!) chcemy napisać jakiś testowy test jednostkowy dla Androida , powinniśmy umieścić nasze testowe pliki java w app/src/androidTest/java/your.package.namekatalogu i użyć adnotacji typu@RunWith(AndroidJUnit4.class)

Sepehr Behroozi
źródło
Używam Mavena, co wtedy?
JohnyTex
2
@JohnyTex Używanie Maven nie wpływa na moją odpowiedź. Zależy to tylko od struktury pliku projektu.
Sepehr Behroozi
34

Aktualizacja

Biblioteka testów systemu Android jest teraz częścią AndroidX. Upewnij się, że używasz poprawnych zależności Gradle, które można znaleźć w oficjalnej dokumentacji .

Oryginalna odpowiedź

Odkryłem tutaj, że istnieją nowsze wersje biblioteki wsparcia testowania niż ta, której używałem:

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

Uwaga: pamiętaj, aby używać najnowszych wersji tych bibliotek. To pytanie pochodzi z czasów, gdy biblioteka obsługi testów Androida była nowa, a podane tutaj numery wersji są bardzo nieaktualne.

Code-Apprentice
źródło
3
Zastanawiam się, dlaczego dokumentacja nic o tym nie wspomina , chyba że to przeoczyłem. Oszczędziłoby mi to trochę smutku.
Nom1fan
@Karoly Nadal mam problem. Czy znalazłeś jakieś rozwiązanie?
Mahdi
26

Rozwiązałem problem, wprowadzając niewielką zmianę w pliku build.gradle aplikacji. W dependencies { ... }sekcji upewnij się, że zawiera następujący wiersz:

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

lub jakakolwiek wersja jest najnowsza w tym momencie ( ...Compilejest przestarzała i została zastąpiona przez ...Implementation). Zwróć uwagę na użycie debugImplementation. Android Studio zasugerował automatyczne dołączenie go z androidTestImplementation, co nie zadziałało.

Dowiedziałem się, jak zmienić to z testu na debugowanie, zaglądając do struktury projektu pod Zależnościami modułu aplikacji, gdzie możesz zmienić zakres każdej zależności, patrz poniżej.

Struktura projektu

stemadsen
źródło
Zauważ, że spowoduje to skompilowanie biblioteki wsparcia testów do pliku APK.
Code-Apprentice
Działa również z testImplementation „com.android.support.test: rules: 1.0.2”
Prat
10

Zwróć uwagę, że ten OP ma teraz 4 lata, więc jeśli używasz Androida X, AndroidJUnit4.classjest on przestarzały, masz tam błąd i jeszcze jeden z tym androidx.test.ext.junit.runners.AndroidJUnit4. Proponuję przeczytać te linki, aby rozwiązać problem.

AndroidJUnit4.class jest przestarzały: jak używać androidx.test.ext.junit.runners.AndroidJUnit4?

Migracja testów Junit4 do Androidx: co powoduje, że „delegat runner nie mógł zostać załadowany”? U mnie Android Studio zasugerował wymianę

@RunWith(AndroidJUnit4.class)

który został wycofany z

@RunWith(AndroidJUnit4ClassRunner.class)

i to

androidx.test.ext.junit.runners.AndroidJUnit4

z tym

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

Po tym błąd zniknął, ale nie wiem, czy przyszły test po uruchomieniu jest OK ?!

leonidaa
źródło
@ Code-Apprentice - Bardzo dziękuję za edycję, teraz jest znacznie ładniej
leonidaa
8

W moim przypadku pomogło to w wydaniu wariantu:

android {
    ...
    testBuildType "release" 
}
Andrew Glukhoff
źródło
Czy możesz podać bardziej kompletne rozwiązanie. Nie rozumiem kontekstu tego, co zrobiłeś.
Code-Apprentice
Napotkałem problem „Nie można rozwiązać symbolu„ AndroidJUnit4 ”” podczas testu espresso, gdy zmieniłem wariant kompilacji na „wydanie”. Jak tylko dodałem to oświadczenie (testBuildType "release") do build.gradle na poziomie aplikacji (pobrane z developer.android.com/studio/test/index.html#add_a_new_test ) ten problem zniknął.
Andrew Glukhoff,
Sformatowałem Twoją odpowiedź jako kod w Twojej odpowiedzi. Powinieneś dodać więcej szczegółów, takich jak link z twojego komentarza i opisać, gdzie ten blok idzie w twoim projekcie.
Code-Apprentice
7

Typową przyczyną tego problemu jest to, że podczas dodawania poniższej zależności:

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

Jest to poprawna zależność, jeśli zamierzasz używać testów instrumentalnych (testy w androidTestpakiecie java)

Ale do implementacji lokalnych testów jednostkowych (testy w testpakiecie java) przy użyciu wyżej wymienionej zależności; wtedy staniesz twarzą w twarzCannot resolve symbol 'AndroidJUnit4'

Dzieje się tak, ponieważ androidTestImplementationdyrektywa jest używana do importowania bibliotek w testach instrumentalnych, ale nie w lokalnych testach JVM / jednostkowych.

Jeśli chcesz użyć AndroidJUnit4w lokalnej JVM / teście jednostkowym, użyj zamiast tego poniższej zależności

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

To samo dotyczy, jeśli dodasz tę drugą zależność podczas używania AndroidJUnit4w teście instrumentalnym, otrzymasz również Cannot resolve symbol 'AndroidJUnit4'; ponieważ używasz złej dyrektywy.

Zain
źródło
1
W scenariuszu z mojego pierwotnego pytania przeprowadzałem testy instrumentalne. Jest to jednak wielkie wyróżnienie i miejmy nadzieję, że pomoże w przyszłości odwiedzającym to pytanie.
Code-Apprentice
5

Jeśli ktoś nadal ma ten problem:

Nie można rozwiązać symbolu „AndroidJUnit4”

i używając API 27, w build.gradlemodule znajdującym się w module app, dodaj następujące wiersze:

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
źródło
3

umieść ten kod w swoich zależnościach

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
źródło
1
Kiedy pisałem to pytanie, nie dodałem jeszcze espresso jako zależności dla testów jednostkowych.
Code-Apprentice
+1 Właściwie to rozgryzłem tuż przed tym, jak to zobaczyłem, ale tak, właśnie to zrobiłem i to rozwiązało mój problem.
Tony D
2
Postępuj zgodnie z dwiema odpowiedziami poniżej od @sepehr. Klasa AndroidJunit4 nie znajduje się w pakiecie espresso, ale jest obecna w pakiecie android.support.test.runner. a wszystko, co musisz zrobić, to dołączyć @Runwith (AndroidJunit4.class), aby napisać powyżej / dla przypadku testowego obecnego w src / Androidtest / java, INSTED OF, w tym w przypadkach testowych napisanych w src / test / java.
Khay
2

Jeśli używasz projektu z wieloma typami kompilacji, wybrany typ kompilacji w oknie wariantu kompilacji musi być wymieniony z tagiem testBuildType w pliku build.gradle modułu.

Na przykład: Jeśli używasz debugowania typu kompilacji , powinieneś dodać android{testBuildType "debug" }, jeśli używasz stage, dodaj android{testBuildType "stage"}instrukcję w tagu android.

Rahul Rastogi
źródło
Czy sugerujesz edycję pliku kompilacji, jeśli chcesz zmienić testowany wariant?
nasch
2

Przenieś klasę testową do src / androidTest / java /. Wtedy zależność się rozwiąże.

Komal Nikhare
źródło
Lol ... naprawdę ...
Manish Kumar Sharma
1

Klasyczna pamięć podręczna Invalidate / Restart pomogła mi! :)

user_MGU
źródło
1

Dodaj tę zależność w pliku build.gradle:

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

Zaktualizuj wersję końcową ( 1.1.1) o najnowszą wydaną wersję.

KOUSHIKZEP99
źródło
0

Dodawanie

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

rozwiązałem dokładnie ten problem za mnie.

donlys
źródło
Jest to już określone w zaakceptowanej odpowiedzi. Powinieneś także sprawdzić, czy istnieje nowsza wersja i użyć jej zamiast tego.
Code-Apprentice
Czy androidTestCompile jest taki sam jak kompilacja?
donlys
compiledyrektywy zależności nazw używane w aplikacji głównej, podczas gdy androidTestComiplezależności nazw używane do testowania. Więc poprawną odpowiedzią jest użycie androidTestCompile, a nie compile.
Code-Apprentice
0

Jak pokazuje lista odpowiedzi, może to być spowodowane kilkoma przyczynami. Jeszcze jedno na liście:

Prowadziłem nadgorliwy LINT, który usunął wszystkie niewykorzystane importy. Spowoduje to te same błędy i łatwo nie zauważyć, że na tym polega problem.

Android-studio podświetli odniesienia, których brakuje w kodzie testu - i pojawi się wyskakujące okienko ALT-ENTER (jest to bit, który łatwo przeoczyć).

Następnie muszę usunąć testy z LINT - lub przynajmniej wyłączyć to ostrzeżenie.

Edycja: @ Code-Apprentice, brakujące wiersze to:

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;

Więc pierwszy błąd w pliku wystąpił @RunWith(AndroidJUnit4.class)na początku mojej klasy testowej.

winwaed
źródło
Czy możesz pokazać przykładowy test, w którym to się wydarzyło?
Code-Apprentice
0

Wersja krótkiej historii:

Zaktualizuj Gradle do najnowszej wersji

Odpowiadam na ten post z 15 lutego 2020 roku. Niestety wyczerpałem wszystkie możliwe rozwiązania wymienione tutaj i nie tylko.

Tak, żaden z powyższych nie działa. Używam wbudowanej funkcji „Migrate to Andoridx”, może mi ona przypominać, że muszę zaktualizować docelowe wersje SDK i moją wersję Gradle. Po uaktualnieniu mojej wersji Gradle z 2.0.2 do 3.5.3. Po prostu działają, nawet stara instrukcja importu działa.

Bryan Zhang
źródło
Cześć, to stare pytanie ma już zaakceptowaną odpowiedź i nie widzę, w jaki sposób Twoja odpowiedź dodaje coś nowego do pytania. Proszę nie odpowiadać, jeśli Twoja odpowiedź nie dodaje nic nowego do istniejących odpowiedzi. Dzięki
hippozhipos
Zaakceptowana odpowiedź zawiera link do aktualizacji zależności testowych do biblioteki testowej AndroidX. Prawdopodobnie właśnie to naprawiło problem we wszystkich próbach.
Code-Apprentice
0

Ten sam błąd wystąpił, gdy śledzę aplikację Google IOSched i konfiguruję projekt z trzema typami kompilacji [debugowanie, wydanie, przemieszczanie], w których debugowanie i wydanie mają ten sam katalog źródłowy

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

W takim przypadku określ testBuildTypeplik build.gradle na poziomie modułu, a projekt powinien być teraz w stanie rozpoznać symbol „AndroidJUnit4”.

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

testBuildType "staging"
...

Źródła: https://github.com/google/iosched/blob/master/mobile/build.gradle

Jie Heng
źródło