Impossibile risolvere il simbolo "AndroidJUnit4"


139

Ovviamente ho bisogno della dichiarazione di importazione corretta per risolvere questo problema. Secondo i documenti perAndroidJUnit4 , questo dovrebbe essere

import android.support.test.runner.AndroidJUnit4;

Quando lo faccio, Android Studio si evidenzia runnerin rosso e si lamenta "Impossibile risolvere il simbolo 'corridore'".

sfondo

Sono arrivato a questo punto seguendo i tutorial sul sito per sviluppatori Android per l' impostazione dei test tramite UI Automator . Il primo problema che ho riscontrato è stato quello com.android.support:support-v4:22.2.0e com.android.support.test:runner:0.2dipende da diverse versioni di com.android.support:support-annotations. Ho seguito i suggerimenti di questa segnalazione di bug di Android e ho aggiunto quanto segue a allprojectsnel mio progetto build.gradle:

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

Ciò ha risolto l'errore immediato, ma sospetto che abbia portato ai miei problemi attuali. Qualcuno ha qualche suggerimento su come risolvere questo problema?

Sezioni pertinenti da `./gradlew: app: dipendenze

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

Ciò suggerisce che la tua build manchi com.android.support.test:runnercompletamente. Puoi confermare tramite gradle dependenciesche lo stai ancora inserendo dopo la resolutionStrategymodifica?
CommonsWare il

@CommonsWare Aggiunto l'output delle dipendenze alla mia domanda. Non so che cosa (*)significhi dopo com.android.support.test:runner:0.2.
Apprendista di codice

Secondo la gente Gradle , l'asterisco "significa che la vista ad albero del grafico delle dipendenze è ridotta a questo punto perché quella parte del grafico era già elencata in precedenza". Sono sconcertato sul perché questo non funziona per te.
CommonsWare il

1
Nota che la risposta di @stemadsen del 2018 è potenzialmente più pertinente delle altre. Qualcuno una volta ha scritto di un test che ha mantenuto le domande lo stesso anno dopo anno, ma le risposte sono cambiate ...
Roy Falk,

Risposte:


199

Assicurati che la tua app sia nella versione build di debug. Vai a Build> Seleziona Build Variant ... e dovrebbe apparire quanto segue:

inserisci qui la descrizione dell'immagine


5
Grazie, mi hai salvato
Divano

10
Salute. La documentazione non afferma mai "questa roba funzionerà solo nel debug". Così frustrante.
Chantell Osejo,

27
Wow. Voto positivo x 1 milione. Questa è la risposta che cercavo da giorni. Anche trovato questo in modo da poter cambiare il tipo di build da utilizzare per esso. android { testBuildType "staging"}
WIllJBD,

5
Dovrò presentare una segnalazione di bug per questo con il team di Android Studio Tools. Anche i tipi di build che ereditano da debugnon funzionano se non impostati esplicitamente su "debug"
Gautham C.,

1
wow, sto usando un buildType di Cutom con initWith (buildTypes.debug) e non riesco ancora. Solo e solo se sto usando il debug funziona direttamente!
Karoly,

120

Ho fatto l'errore di mettere le classi di test su src / test . Dopo averli spostati su src / androidTest / java / la dipendenza è stata risolta.


Nel mio caso la mia cartella di test era src / test per qualche motivo, quindi ho dovuto rinominarlo in src / androidTest e ha risolto il mio problema, dopo 3 ore ...
Teo Inke

69

Ok, ecco il tuo errore e il mio!

Se stiamo per scrivere un pezzo di codice per i test delle unità locali non dovremmo usare @RunWith(AndroidJUnit4.class)perché non utilizziamo AndroidJUnit4 ma abbiamo bisogno di Junit4. quindi dovremmo scrivere @RunWith(JUnit4.class). E ovviamente il tuo file di test Java è nella app/src/test/java/your.package.namedirectory.

Altrimenti se (!!) vogliamo scrivere alcuni Test Unit unità Android dovremmo mettere i nostri file java di test nella app/src/androidTest/java/your.package.namedirectory e usare le annotazioni come@RunWith(AndroidJUnit4.class)


Sto usando Maven, e allora?
JohnyTex,

2
@JohnyTex L'uso di Maven non influisce sulla mia risposta. Dipende solo dalla struttura del file del progetto.
Sepehr Behroozi,

34

Aggiornare

La libreria di test Android ora fa parte di AndroidX. Assicurarsi di utilizzare le dipendenze Gradle corrette presenti nella documentazione ufficiale .

Risposta originale

Ho trovato qui che ci sono le versioni più recenti del libreria di supporto Test di quello che mi utilizzando:

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

Nota: assicurarsi di utilizzare le versioni più recenti di queste librerie. Questa domanda è di un periodo in cui la libreria di supporto test Android era nuova e i numeri di versione qui sono molto obsoleti.


3
Mi chiedo perché la documentazione non menzioni nulla al riguardo, a meno che non mi sia persa. Mi avrebbe risparmiato un po 'di dolore.
Nom1fan,

@Karoly Ho ancora problemi. Hai trovato una soluzione?
Mahdi,

26

Ho risolto il problema apportando una piccola modifica nel file build.gradle dell'app. Nella dependencies { ... }sezione, assicurati di includere la seguente riga:

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

o qualsiasi versione sia la più recente a quel punto ( ...Compileè obsoleta ed è stata sostituita da ...Implementation). Nota l'uso di debugImplementation. Android Studio ha suggerito di includerlo automaticamente con androidTestImplementation, che non ha funzionato.

Ho scoperto come cambiarlo da test a debug guardando nella Struttura del progetto in Dipendenze del modulo app, dove puoi cambiare l'ambito di ogni dipendenza, vedi sotto.

Struttura del progetto


Si noti che ciò compilerà la libreria di supporto per i test nell'APK.
Apprendista di codice

Funziona anche con testImplementation "com.android.support.test: rules: 1.0.2"
Prat

10

Si noti che questo OP è ora nel 2019, a 4 anni, quindi se si utilizza Android X AndroidJUnit4.classè deprecato, si verifica un errore lì e un altro con questo androidx.test.ext.junit.runners.AndroidJUnit4. Suggerisco di leggere questo link per risolvere il problema.

AndroidJUnit4.class è obsoleto: come utilizzare androidx.test.ext.junit.runners.AndroidJUnit4?

Migrazione dei test Junit4 su androidx: Quali sono le cause 'caricamento delegato non può essere caricato'? Per me Android Studio ha suggerito di sostituire

@RunWith(AndroidJUnit4.class)

che è stato deprecato con

@RunWith(AndroidJUnit4ClassRunner.class)

e questo

androidx.test.ext.junit.runners.AndroidJUnit4

con questo

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

Dopodiché l'errore è scomparso ma non so se il test futuro verrà eseguito correttamente ?!


@ Apprendista di codice - Grazie mille per il montaggio, ora è molto più bello
leonidaa

8

Nel mio caso questo ha aiutato per la variante di rilascio:

android {
    ...
    testBuildType "release" 
}

Puoi dare una soluzione più completa. Non capisco il contesto di quello che hai fatto.
Apprendista di codice

Ho riscontrato il problema "Impossibile risolvere il simbolo" AndroidJUnit4 "sul test del caffè espresso quando ho modificato la variante di build in" rilascio ". Non appena ho aggiunto questa affermazione (testBuildType "release") a build.gradle a livello di app (tratto da developer.android.com/studio/test/index.html#add_a_new_test ) questo problema è scomparso.
Andrew Glukhoff,

Ho formattato la tua risposta il codice nella tua risposta. Dovresti aggiungere ulteriori dettagli, come il link del tuo commento e descrivere dove va questo blocco nel tuo progetto.
Apprendista di codice

7

La causa comune di questo problema è che quando si aggiunge la dipendenza di seguito:

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

Questa è una dipendenza corretta se si intende utilizzare test strumentati (test nel androidTestpacchetto java)

Ma per implementare test unitari locali (test nel testpacchetto java) durante l'utilizzo della dipendenza sopra menzionata; allora dovrai affrontareCannot resolve symbol 'AndroidJUnit4'

Questo perché la androidTestImplementationdirettiva viene utilizzata per importare librerie in test strumentati, ma non nei test JVM / unità locali.

Se si desidera utilizzare AndroidJUnit4in un test JVM / unità locale, utilizzare invece la dipendenza sottostante

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

La stessa cosa si applica se si aggiunge quest'ultima dipendenza durante l'utilizzo AndroidJUnit4in test strumentato, si otterrà anche Cannot resolve symbol 'AndroidJUnit4'; perché stai usando la direttiva sbagliata.


1
Nello scenario della mia domanda originale, stavo eseguendo test strumentali. Tuttavia, questa è una grande distinzione da fare e, si spera, aiuterà i visitatori a questa domanda in futuro.
Apprendista di codice

5

Se qualcuno ha ancora questo problema:

Impossibile risolvere il simbolo "AndroidJUnit4"

e utilizzando l'API 27, nella build.gradlequale si trova nel modulo dell'app, aggiungere le seguenti righe:

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'

3

inserisci questo codice nelle tue dipendenze

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

1
Quando ho scritto questa domanda, non avevo ancora aggiunto l'espresso come dipendenza per i test unitari.
Apprendista di codice il

+1 L'ho capito proprio prima di vederlo, ma sì, questo è quello che ho fatto e ha risolto il mio problema.
Tony D,

2
Segui le due risposte sottostanti da @sepehr. La classe AndroidJunit4 non è nel pacchetto espresso installato nel pacchetto android.support.test.runner. e tutto quello che devi fare è includere @Runwith (AndroidJunit4.class) è scrivere sopra / per caso di test presente in src / Androidtest / java, ISTITUTO di includere in casi di test scritti sotto src / test / java.
Khay,

2

Se stai usando un progetto con più tipi di build, il tipo di build selezionato nella finestra della variante di build deve essere menzionato con il tag testBuildType nel file build.gradle del modulo.

Ad esempio: se stai usando il debug di tipo build, dovresti aggiungere android{testBuildType "debug" }, se usi stage quindi aggiungi l' android{testBuildType "stage"}istruzione nel tag Android.


Stai suggerendo di modificare il file di build se vuoi cambiare la variante da testare?
nasch


1

La classica cache / riavvio non validi mi ha aiutato! :)


1

Aggiungi questa dipendenza nel tuo file build.gradle:

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

Aggiorna la versione finale ( 1.1.1) con l'ultima versione rilasciata.


0

Aggiunta

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

risolto questo problema esatto per me.


Questo è già indicato nella risposta accettata. Dovresti anche vedere se esiste una versione più recente e usarla invece.
Apprendista di codice

AndroidTestCompile è uguale a compilazione?
donlys,

compiledirettive dipendenze dei nomi utilizzate nell'app principale mentre androidTestComipledipendenze dei nomi utilizzate per i test. Quindi la risposta corretta è usare androidTestCompile, no compile.
Apprendista di Codice

0

Come dimostra l'elenco delle risposte, ciò può essere causato da alcune cose. Un altro per l'elenco:

Ho eseguito un LINT troppo zelante che ha rimosso tutte le importazioni inutilizzate. Ciò produrrà gli stessi errori ed è facile non notare che questo è il problema.

Android-studio evidenzierà i riferimenti mancanti nel codice di test e apparirà il popup ALT-ENTER (questo è il bit che è facile perdere).

Successivamente, devo rimuovere i test da LINT - o almeno disabilitare questo avviso.

Modifica: @ Code-Apprentice, le righe mancanti erano:

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;

Quindi il primo errore nel file è stato @RunWith(AndroidJUnit4.class)all'inizio della mia classe di test.


Puoi mostrare un test di esempio in cui questo è successo per te?
Apprendista di codice

0

Versione per racconti:

Aggiorna il tuo Gradle all'ultima versione

Sto rispondendo a questo post della domanda il 15 febbraio 2020. Sfortunatamente, ho esaurito tutte le possibili soluzioni menzionate qui e altrove.

Sì, nessuno di loro sopra funziona. Uso la funzione integrata "Migrate su Andoridx", potrebbe ricordarmi che devo aggiornare le mie versioni dell'SDK di destinazione e la mia versione gradle. Dopo aver aggiornato la mia versione Gradle dalla 2.0.2 alla 3.5.3. Funzionano e funziona anche la vecchia dichiarazione di importazione.


Ciao, questa è una vecchia domanda che ha già una risposta accettata e non riesco a vedere come la tua risposta aggiunge qualcosa di nuovo alla domanda. Si prega di evitare di rispondere se la risposta non aggiunge nulla di nuovo alle risposte esistenti. Grazie
hippozhipos il

La risposta accettata fornisce un collegamento per aggiornare le dipendenze dei test nella libreria Test di AndroidX. Questa è probabilmente la cosa che l'ha risolto in tutte le cose che hai provato.
Apprendista di codice

0

Lo stesso errore si è verificato quando seguo l'app Google IOSched e configuro il mio progetto con tre tipi di build [debug, release, staging] in cui debug e release condividono la stessa directory di origine

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

In questo caso, specifica il testBuildTypefile build.gradle a livello di modulo e il progetto dovrebbe ora essere in grado di risolvere il simbolo "AndroidJUnit4".

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

testBuildType "staging"
...

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

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.