AndroidJUnit4.class застаріло: як користуватися androidx.test.ext.junit.runners.AndroidJUnit4?


255

Для моїх інструментальних тестів я використовував

@RunWith(AndroidJUnit4.class)

з

import androidx.test.runner.AndroidJUnit4;

щоб встановити мої тестові справи. Тепер цей рядок буде позначена як застаріла з натяком , щоб використовувати AndroidJUnit4з

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

Однак якщо я спробую імпортувати AndroidJUnit4з названого пакета, я отримаю помилку, цю extпроблему неможливо вирішити.

Чи маєте ви ідею, який пакунок слід включити в gradle, щоб вирішити цю проблему?



4
Я думаю, що ваше джерело застаріле, вони взагалі не згадують про androidx.
Марсель Гангвіш

1
Тестування блоків на Android - це безлад і помилок. Єдине, що для мене працює - це створити новий проект скретчів, скопіювати відповідні файли з цього проекту в мій, перейти в режим налагодження і зробити повну інвалідність кешу. Також для тестів AndroidJUnit4 ім'я пакета має відповідати імені пакета бібліотеки.
Руперт Роунслі

Відповіді:


376

Відповідно до документації для AndroidJUnit4 ,

  1. Файл gradle повинен містити такий рядок: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Змініть клас тесту на AndroidJUnit4ClassRunnerзAndroidJUnit4

Якщо це все ще не працює, переконайтесь, що ви очистили та / або відновили проект. Також ви можете перевірити поточну версію безпосередньо у сховищі Maven Google


20
мій градус має це і досі не може вирішити проблему.
зуко

@zuko Очистіть і / або відновіть свій проект, він повинен бути там. Якщо ви все ще не використовуєте модулі, перевірте, чи встановлена ​​ваша ієрархія залежностей, як ви очікували; Вам може знадобитися додати їх також до модулів верхнього рівня - оскільки тестуючі бібліотеки не компілюються в спільні модулі для використання модулями вище за течією.
Джон Адамс

@JonAdams моє дерево залежностей чомусь тримається за посиланням на старі бібліотеки, хоча я думав, що я їх видалив. тож, перепробувавши різні речі, я закінчив просто перенести проект на новий, і зараз все добре.
зуко

7
Чи слід також змінити testInstrumentationRunner у файлі gradle з androidx.test.runner.AndroidJUnitRunner на androidx.test.ext.junit.runners.AndroidJUnit4 ? Просто цікаво, чи є невідповідність.
дроїд

22
@ Droid Замініть старий пакет AndroidJUnit4 при імпорті на новий. Просто замініть імпорт androidx.test.runner.AndroidJUnit4; з імпортом androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive

27

Якщо ви спробували рішення @ MarcelGangwisch, і ваша збірка не вдається сказати, що не може знайти ресурс. Ви також очистили / відновили проект, і він все ще не працює, спробуйте: (ґрунтуючись також на рішенні @ KrzysztofDziuba)

У своєму файлі gradle, де ви змінили залежність, переконайтеся, що додаєте його як потрібний тип, тобто:

Для тестів на інтерфейс користувача:

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

Для одиничних тестів:

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

У моєму випадку я додав його як обидва, і зараз він працює.


13

Рішення

  1. Додайте цей рядок до build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Перехід AndroidJUnit4до AndroidJUnit4ClassRunnerтестового класу

Увага

Я отримав таку ж помилку, але наступне рішення для мене не вдалося:

Файл -> Недійсний кеш ... та виберіть Недійсний та Перезапустити


12

Для мене спрацювали наступні кроки:
1. Замініть бібліотеки androidx на опубліковану тут . мій фінал app/build.gradleвиглядав так:

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'

}

Потім я вручну замінив імпортні модулі у своєму ExampleInstrumentTest.javaкласі останніми класами:

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

Що мене клопіло, це те, що InstrumentationRegisteryклас все ще застарілий. Так я використовував InstrumentationRegistry.getInstrumentation().getTargetContext();з androidx.test.platform.app.InstrumentationRegistryкласу.


3
@RunWith(AndroidJUnit4ClassRunner.class)була частиною, яка вирішила проблему в моєму випадку. Я не розумію, чому андроїд-студія іноді генерує застарілий код.
Рафсанджані

Використовуйте ApllicationProvider.getApplicationContext<Context>()замістьInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch

7

Я спробував усе подане вище, поки не зайшов на офіційний сайт Android, і вони запропонували імпортувати з, androidx.test.ext.junit.runners.AndroidJUnit4а не з androidx.test.runner.AndroidJUnit4. посилання



0

Якщо ви імпортували ці тестові бібліотеки AnroidX, синхронізували та знову створили проект, але імпортовані пакети все ще не були вирішені. Пам'ятайте лише, як ви модернізували проект до AndroidX, закрили Android Studio та видалили .ideaпапку та знову відкрили проект ...

Це працювало для мене!


0
  1. Включіть ці рядки в модуль додатків build.gradle.

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

  2. У тестовому класі замініть свого тестового бігуна на

    імпортувати androidx.test.ext.junit.runners.AndroidJUnit4;

  3. Якщо InstrumentationRegistry.getTargetContext()не рекомендується використовувати InstrumentationRegistryз androidx.test.platform.appтак

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.