AndroidJUnit4.class jest przestarzały: Jak korzystać z androidx.test.ext.junit.runners.AndroidJUnit4?

254

Do testów oprzyrządowania używałem

@RunWith(AndroidJUnit4.class)

z

import androidx.test.runner.AndroidJUnit4;

w celu ustalenia moich przypadków testowych. Obecnie linia ta zostanie oznaczona jako przestarzałe z nutą do korzystania AndroidJUnit4z

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

Jednak jeśli spróbuję zaimportować AndroidJUnit4z nazwanego pakietu, otrzymam błąd, którego extnie można rozwiązać.

Czy masz pomysł, jaki pakiet powinien zostać uwzględniony w programie, aby rozwiązać ten problem?

Marcel Gangwisch
źródło
4
Myślę, że twoje źródło jest przestarzałe, w ogóle nie wspominają o Androidxie.
Marcel Gangwisch,
1
Testy jednostkowe na Androidzie to kompletny bałagan błędów i przestarzałości. Jedyną rzeczą, która działa dla mnie, jest utworzenie nowego projektu scratch, skopiowanie odpowiednich plików z tego projektu do mojego, przejście do trybu debugowania i pełne unieważnienie pamięci podręcznej. Również w przypadku testów AndroidJUnit4 nazwa pakietu musi być zgodna z nazwą pakietu biblioteki.
Rupert Rawnsley,

Odpowiedzi:

375

Według dokumentacji AndroidJUnit4 ,

  1. Plik oceny powinien zawierać następujący wiersz: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Zmień klasę testową na AndroidJUnit4ClassRunnerzAndroidJUnit4

Jeśli nadal nie działa, upewnij się, że wyczyściłeś i / lub odbudowałeś swój projekt. Możesz również sprawdzić bieżącą wersję bezpośrednio w repozytorium maven Google

Marcel Gangwisch
źródło
20
moja ocena ma to i nadal nie może rozwiązać problemu.
zuko
@zuko Oczyść i / lub przebuduj swój projekt, powinien tam być. Jeśli nadal nie masz i używasz modułów, sprawdź, czy hierarchia zależności jest skonfigurowana zgodnie z oczekiwaniami; może być konieczne dodanie ich również do modułów najwyższego poziomu - ponieważ biblioteki testowe nie są kompilowane we współdzielone moduły do ​​użytku przez moduły nadrzędne.
Jon Adams
@JonAdams z jakiegoś powodu moje drzewo zależności nadal zawierało odwołanie do starszych bibliotek, chociaż myślałem, że je usunąłem. więc po wypróbowaniu różnych rzeczy po prostu migrowałem projekt do nowego i wszystko jest już w porządku.
zuko
7
Czy powinniśmy również zmienić testInstrumentationRunner w pliku oceny z androidx.test.runner.AndroidJUnitRunner na androidx.test.ext.junit.runners.AndroidJUnit4 ? Zastanawiam się tylko, czy istnieje niezgodność.
Droid
22
@A Droid Zamień stary pakiet AndroidJUnit4 w imporcie na nowy. Wystarczy wymienić import androidx.test.runner.AndroidJUnit4; z importem androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive
27

Jeśli wypróbowałeś rozwiązanie @ MarcelGangwisch, a kompilacja nie powiedzie się, że nie można znaleźć zasobu ORAZ również wyczyściłeś / przebudowałeś projekt i nadal nie działa, spróbuj tego: (w oparciu również o rozwiązanie @ KrzysztofDziuba)

W pliku ocen, w którym zmieniłeś zależność, upewnij się, że dodajesz go jako potrzebny typ, tj .:

W przypadku testów interfejsu użytkownika:

androidTestImplementation „androidx.test.ext: junit: 1.1.0”

Do testów jednostkowych:

testImplementation „androidx.test.ext: junit: 1.1.0”

W moim przypadku dodałem go jako oba i teraz działa.

JJ Du Plessis
źródło
13

Rozwiązanie

  1. Dodaj ten wiersz do build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Zmień AndroidJUnit4na AndroidJUnit4ClassRunnerw klasie testowej

Ostrzeżenie

Wystąpił ten sam błąd, ale dla mnie następujące rozwiązanie nie powiodło się:

Plik -> Unieważnij pamięć podręczną ... i wybierz Unieważnij i uruchom ponownie

HeshanHH
źródło
12

Dla mnie zadziałały następujące kroki:
1. Zastąp biblioteki systemu Androidx biblioteką opublikowaną tutaj . mój finał app/build.gradlewyglądał tak:

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'

}

Następnie ręcznie zastąpiłem zaimportowane moduły w mojej ExampleInstrumentTest.javaklasie najnowszymi klasami:

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

To, co mnie wkurzyło, to fakt, że InstrumentationRegisterylekcja była nadal przestarzała. Więc użyłem InstrumentationRegistry.getInstrumentation().getTargetContext();z androidx.test.platform.app.InstrumentationRegistryklasy.

ansh sachdeva
źródło
3
@RunWith(AndroidJUnit4ClassRunner.class)była część, w której problem został rozwiązany w moim przypadku. Naprawdę nie rozumiem, dlaczego studio Android czasami generuje przestarzały kod.
Rafsanjani,
Użyj ApllicationProvider.getApplicationContext<Context>()zamiastInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch
7

Próbowałem wszystkich wyżej wymienionych, dopóki nie poszedłem na oficjalną stronę Androida, i zasugerowali import z androidx.test.ext.junit.runners.AndroidJUnit4zamiast androidx.test.runner.AndroidJUnit4. połączyć

Prox
źródło
0

Jeśli zaimportujesz te biblioteki testowe AnroidX, zsynchronizujesz i przebudujesz projekt, ale zaimportowane pakiety nadal nie zostały rozwiązane. Pamiętaj tylko, jak zaktualizowałeś swój projekt do systemu AndroidX, zamknij Android Studio, usuń .ideafolder i ponownie otwórz projekt ...

To zadziałało dla mnie!

Jeff T.
źródło
0
  1. Uwzględnij te wiersze w module aplikacji build.gradle.

    testImplementation „androidx.test.ext: junit: 1.1.1„ androidTestImplementation ”androidx.test.ext: junit: 1.1.1”

  2. W klasie testowej zamień swojego biegacza testowego na

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

  3. Jeśli InstrumentationRegistry.getTargetContext()jest przestarzała korzystanie InstrumentationRegistryz androidx.test.platform.apptakiego

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Balsamiq
źródło