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


256

Per i miei test di strumentazione che stavo usando

@RunWith(AndroidJUnit4.class)

a partire dal

import androidx.test.runner.AndroidJUnit4;

al fine di stabilire i miei casi di test. Ora, questa linea viene segnalato come disapprovato con il suggerimento di utilizzare AndroidJUnit4da

import androidx.test.ext.junit.runners.AndroidJUnit4

Tuttavia, se provo a importare AndroidJUnit4dal pacchetto denominato, visualizzo l'errore, che extnon può essere risolto.

Hai un'idea, quale pacchetto dovrebbe essere incluso in Gradle per risolvere questo problema?



4
Penso che la tua fonte sia viola, non menzionano affatto androidx.
Marcel Gangwisch,

1
Il test unitario su Android è un vero casino di bug e deprecazioni. L'unica cosa che funziona per me è la creazione di un nuovo progetto scratch, la copia dei file pertinenti da quel progetto al mio, il passaggio alla modalità debug e l'invalidazione completa della cache. Anche per i test AndroidJUnit4 il nome del pacchetto deve corrispondere al nome del pacchetto della libreria.
Rupert Rawnsley,

Risposte:


377

Secondo la documentazione per AndroidJUnit4 ,

  1. Il file gradle dovrebbe contenere la seguente riga: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Cambia la classe di test AndroidJUnit4ClassRunnerda aAndroidJUnit4

Se il problema persiste, assicurati di pulire e / o ricostruire il tuo progetto. Inoltre puoi controllare la versione corrente direttamente nel repository di Maven di Google


20
il mio voto ha questo e ancora non riesco a risolvere il problema.
zuko,

@zuko Pulisci e / o ricostruisci il tuo progetto, dovrebbe essere lì. In caso contrario e stai utilizzando i moduli, verifica che la gerarchia delle dipendenze sia impostata come previsto; potrebbe essere necessario aggiungerli anche ai moduli di livello superiore, poiché le librerie di test non vengono compilate in moduli condivisi per l'utilizzo da parte dei moduli upstream.
Jon Adams il

@JonAdams il mio albero delle dipendenze ha continuato a trattenere un riferimento alle librerie più vecchie per qualche motivo anche se pensavo di averle rimosse. così dopo aver provato varie cose ho finito per migrare il progetto su uno nuovo e ora tutto è a posto.
Zuko,

7
Dovremmo anche cambiare testInstrumentationRunner nel file gradle da androidx.test.runner.AndroidJUnitRunner in androidx.test.ext.junit.runners.AndroidJUnit4 ? Mi chiedo solo se c'è una discrepanza.
Un droide il

22
@A Droid Sostituisci il vecchio pacchetto AndroidJUnit4 in importazione con uno nuovo. Basta sostituire import androidx.test.runner.AndroidJUnit4; con import androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive

28

Se hai provato la soluzione di @ MarcelGangwisch e la tua build fallisce dicendo che non riesce a trovare la risorsa E hai anche pulito / ricostruito il tuo progetto e ancora non funziona, prova questo: (basato anche sulla soluzione di @ KrzysztofDziuba)

Nel tuo file gradle in cui hai modificato la dipendenza, assicurati di aggiungerlo come tipo necessario, ad es .:

Per i test dell'interfaccia utente:

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

Per i test unitari:

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

Nel mio caso l'ho aggiunto come entrambi e ora funziona.


13

Soluzione

  1. Aggiungi questa riga in build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Passare AndroidJUnit4a AndroidJUnit4ClassRunnernella classe di test

avvertimento

Ho avuto lo stesso errore, ma la seguente soluzione non è riuscita per me:

File -> Cache non valide ... e selezionare Invalida e riavvia


12

Per me i seguenti passaggi hanno funzionato:
1. Sostituisci le librerie androidx con quella pubblicata qui . il mio finale app/build.gradlesembrava così:

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    ...
}

dependencies {
    ...
    testImplementation 'junit:junit:4.12'

    // Core library
    androidTestImplementation 'androidx.test:core:1.2.0'

    // AndroidJUnitRunner and JUnit Rules
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'

    // Assertions
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.ext:truth:1.2.0'
    androidTestImplementation 'com.google.truth:truth:0.42'

    // Espresso dependencies
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

Ho quindi sostituito manualmente i moduli importati nella mia ExampleInstrumentTest.javaclasse con le ultime classi:

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4ClassRunner.class)
public class ExampleInstrumentedTest {
    ...
    @Rule
    public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class, true);

    @Before
    public void init() {
        ...
    }
    @Test
    public void listCount() {
        ...
    }

    @Test
    public void useAppContext() {
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        Assert.assertEquals("in.curioustools.aad_x_testing2", appContext.getPackageName());
        System.out.println("useAppContext : Test Ran");
    }
}

La cosa che mi infastidiva era il fatto che la InstrumentationRegisteryclasse era ancora deprecata. Quindi ho usato InstrumentationRegistry.getInstrumentation().getTargetContext();dalla androidx.test.platform.app.InstrumentationRegistryclasse.


3
@RunWith(AndroidJUnit4ClassRunner.class)è stata la parte che ha risolto il problema nel mio caso. Non capisco perché a volte Android Studio generi codice obsoleto.
Rafsanjani,

Usa ApllicationProvider.getApplicationContext<Context>()invece diInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch il

7

Ho provato tutto quanto sopra finché non sono andato al sito Android ufficiale e hanno suggerito l'importazione da androidx.test.ext.junit.runners.AndroidJUnit4invece di androidx.test.runner.AndroidJUnit4. collegamento



0

Se hai importato quelle librerie di test AnroidX, hai sincronizzato e ricostruito il progetto, ma i pacchetti importati non erano ancora risolti. Ricorda come hai aggiornato il tuo progetto ad AndroidX, chiudi Android Studio e rimuovi la .ideacartella e riapri il tuo progetto ...

Questo ha funzionato per me!


0
  1. Includi queste righe nel modulo dell'app build.gradle.

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

  2. Nella classe di test sostituire il test runner a

    import androidx.test.ext.junit.runners.AndroidJUnit4;

  3. Se InstrumentationRegistry.getTargetContext()è deprecato, usare InstrumentationRegistryda androidx.test.platform.appquesto

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

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.