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

255

Für meine Instrumentierungstests habe ich verwendet

@RunWith(AndroidJUnit4.class)

von

import androidx.test.runner.AndroidJUnit4;

um meine Testfälle zu etablieren. Nun wird diese Linie mit dem Hinweis als veraltet markiert die Verwendung AndroidJUnit4von

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

Wenn ich jedoch versuche, AndroidJUnit4aus dem genannten Paket zu importieren , wird der Fehler angezeigt, der extnicht behoben werden kann.

Haben Sie eine Idee, welches Paket in gradle enthalten sein sollte, um dieses Problem zu beheben?

Marcel Gangwisch
quelle
4
Ich denke, Ihre Quelle ist veraltet, sie erwähnen Androidx überhaupt nicht.
Marcel Gangwisch
1
Unit-Tests auf Android sind ein Durcheinander von Fehlern und Abwertungen. Das einzige, was für mich funktioniert, ist das Erstellen eines neuen Scratch-Projekts, das Kopieren der relevanten Dateien von diesem Projekt in mein Projekt, das Wechseln in den Debug-Modus und das Ausführen einer vollständigen Cache-Ungültigmachung. Auch für AndroidJUnit4-Tests muss der Paketname mit dem Paketnamen der Bibliothek übereinstimmen.
Rupert Rawnsley

Antworten:

377

Laut der Dokumentation für AndroidJUnit4 ,

  1. Die Gradle-Datei sollte die folgende Zeile enthalten: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Ändern Sie die Testklasse in AndroidJUnit4ClassRunnervonAndroidJUnit4

Wenn es immer noch nicht funktioniert, stellen Sie sicher, dass Sie Ihr Projekt bereinigen und / oder neu erstellen. Sie können die aktuelle Version auch direkt im Maven-Repository von Google überprüfen

Marcel Gangwisch
quelle
20
Mein Absolvent hat dies und kann das Problem immer noch nicht lösen.
zuko
@zuko Bereinige und / oder erstelle dein Projekt neu, es sollte da sein. Wenn dies immer noch nicht der Fall ist und Sie Module verwenden, überprüfen Sie, ob Ihre Abhängigkeitshierarchie wie erwartet eingerichtet ist. Möglicherweise müssen Sie diese auch zu den Modulen der obersten Ebene hinzufügen, da Testbibliotheken nicht zu gemeinsam genutzten Modulen für die Verwendung durch Upstream-Module kompiliert werden.
Jon Adams
@ JonAdams Mein Abhängigkeitsbaum hielt aus irgendeinem Grund an einem Verweis auf ältere Bibliotheken fest, obwohl ich dachte, ich hätte sie entfernt. Nachdem ich verschiedene Dinge ausprobiert hatte, migrierte ich das Projekt einfach auf ein neues und jetzt ist alles in Ordnung.
Zuko
7
Sollten wir auch testInstrumentationRunner in der Gradle-Datei von androidx.test.runner.AndroidJUnitRunner in androidx.test.ext.junit.runners.AndroidJUnit4 ändern ? Ich frage mich nur, ob es ein Missverhältnis gibt.
Ein Droide
22
@A Droid Ersetzen Sie das alte AndroidJUnit4-Paket beim Import durch ein neues. Ersetzen Sie einfach den Import androidx.test.runner.AndroidJUnit4; mit import androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive
27

Wenn Sie die Lösung von @ MarcelGangwisch ausprobiert haben und Ihr Build fehlschlägt und angibt, dass die Ressource nicht gefunden werden kann UND Sie auch Ihr Projekt bereinigt / neu erstellt haben und es immer noch nicht funktioniert, versuchen Sie Folgendes: (basiert auch auf der Lösung von @ KrzysztofDziuba)

Stellen Sie in Ihrer Gradle-Datei, in der Sie die Abhängigkeit geändert haben, sicher, dass Sie sie als den Typ hinzufügen, den Sie benötigen, z.

Für UI-Tests:

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

Für Unit-Tests:

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

In meinem Fall habe ich es als beides hinzugefügt und jetzt funktioniert es.

JJ Du Plessis
quelle
13

Lösung

  1. Fügen Sie diese Zeile zu build.gradle hinzu: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Ändern Sie AndroidJUnit4zu AndroidJUnit4ClassRunnerin der Testklasse

Warnung

Ich habe den gleichen Fehler erhalten, aber die folgende Lösung ist für mich fehlgeschlagen:

Datei -> Caches ungültig machen ... und wählen Sie Ungültig machen und neu starten

HeshanHH
quelle
12

Für mich haben die folgenden Schritte funktioniert:
1. Ersetzen Sie die Androidx-Bibliotheken durch die hier veröffentlichte . Mein Finale app/build.gradlesah so aus:

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'

}

Ich habe dann die importierten Module in meiner ExampleInstrumentTest.javaKlasse manuell durch die neuesten Klassen ersetzt:

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");
    }
}

Was mich nervte, war die Tatsache, dass die InstrumentationRegisteryKlasse immer noch veraltet war. Also habe ich InstrumentationRegistry.getInstrumentation().getTargetContext();aus der androidx.test.platform.app.InstrumentationRegistryKlasse verwendet.

ansh sachdeva
quelle
3
@RunWith(AndroidJUnit4ClassRunner.class)war der Teil, der das Problem in meinem Fall gelöst hat. Ich verstehe nicht wirklich, warum Android Studio manchmal veralteten Code generiert.
Rafsanjani
Verwenden Sie ApllicationProvider.getApplicationContext<Context>()anstelle vonInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch
7

Ich habe alles oben Genannte ausprobiert, bis ich zur offiziellen Android-Site gegangen bin, und sie haben vorgeschlagen, von androidx.test.ext.junit.runners.AndroidJUnit4statt zu importieren androidx.test.runner.AndroidJUnit4. Verknüpfung

Prox
quelle
0

Wenn Sie diese AnroidX-Testbibliotheken importiert haben, haben Sie das Projekt synchronisiert und neu erstellt, aber die importierten Pakete wurden immer noch nicht aufgelöst. Denken Sie daran, wie Sie Ihr Projekt auf AndroidX aktualisiert haben, schließen Sie Android Studio, entfernen Sie den .ideaOrdner und öffnen Sie Ihr Projekt erneut ...

Das hat bei mir funktioniert!

Jeff T.
quelle
0
  1. Fügen Sie diese Zeilen in das build.gradle-App-Modul ein.

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

  2. In der Testklasse ersetzen Sie Ihren Testläufer durch

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

  3. Wenn InstrumentationRegistry.getTargetContext()ist deprecated Verwendung InstrumentationRegistryvon androidx.test.platform.appwie folgt

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Balsamiq
quelle