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

256

Для моих контрольно-измерительных приборов я использовал

@RunWith(AndroidJUnit4.class)

из

import androidx.test.runner.AndroidJUnit4;

чтобы установить мои тестовые случаи. Теперь эта строка помечается как устаревшая с подсказкой для использования AndroidJUnit4из

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

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

У вас есть идея, какой пакет должен быть включен в Gradle для решения этой проблемы?

Марсель Гангвиш
источник
4
Я думаю, что ваш источник устарел, они не упоминают AndroidX вообще.
Марсель Гангвиш
1
Модульное тестирование на Android - это полная путаница ошибок и устареваний. Единственное, что мне подходит, - это создание нового рабочего проекта, копирование соответствующих файлов из этого проекта в мой, переключение в режим отладки и полная аннулирование кэша. Также для тестов AndroidJUnit4 имя пакета должно соответствовать имени пакета библиотеки.
Руперт Роунсли

Ответы:

377

Согласно документации для AndroidJUnit4 ,

  1. Файл Gradle должен содержать следующую строку: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Изменить тестовый класс на AndroidJUnit4ClassRunnerсAndroidJUnit4

Если это все еще не работает, убедитесь, что вы очистили и / или перестроили свой проект. Также вы можете проверить текущую версию прямо в репозитории Google Maven.

Марсель Гангвиш
источник
20
Мой gradle имеет это и до сих пор не может решить проблему.
zuko
@zuko Очистите и / или восстановите ваш проект, он должен быть там. Если все еще нет, и вы используете модули, убедитесь, что ваша иерархия зависимостей настроена так, как вы ожидаете; вам может понадобиться добавить их и в модули верхнего уровня - поскольку библиотеки тестирования не скомпилированы в общие модули для использования вышестоящими модулями.
Джон Адамс
@JonAdams мое дерево зависимостей по какой-то причине продолжало ссылаться на старые библиотеки, хотя я думал, что удалил их. поэтому, попробовав разные вещи, я просто перевел проект на новый, и теперь все в порядке.
Зуко
7
Должны ли мы также изменить testInstrumentationRunner в файле Gradle с androidx.test.runner.AndroidJUnitRunner на androidx.test.ext.junit.runners.AndroidJUnit4 ? Просто интересно, если есть несоответствие.
Дроид
22
@ A Droid Замените старый пакет AndroidJUnit4 при импорте новым. Просто замените импорт androidx.test.runner.AndroidJUnit4; с импортом androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive
28

Если вы попробовали решение @ MarcelGangwisch, и ваша сборка не может сказать, что он не может найти ресурс И вы также очистили / перестроили свой проект, и он все еще не работает, попробуйте это: (также на основе решения @ KrzysztofDziuba)

В своем файле Gradle, где вы изменили зависимость, убедитесь, что вы добавляете ее как нужный вам тип, т.е.

Для тестов пользовательского интерфейса:

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

Для юнит-тестов:

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

В моем случае я добавил как оба, и теперь это работает.

JJ Du Plessis
источник
13

Решение

  1. Добавьте эту строку в build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Изменение AndroidJUnit4к AndroidJUnit4ClassRunnerв тестовом классе

Предупреждение

Я получил ту же ошибку, но следующее решение не удалось для меня:

File -> Invalidate Caches ... и выберите Invalidate and Restart

HeshanHH
источник
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)была часть, которая получила решение проблемы в моем случае. Я не совсем понимаю, почему Android Studio иногда генерирует устаревший код.
Рафсанджани
Используйте ApllicationProvider.getApplicationContext<Context>()вместоInstrumentationRegistry.getInstrumentation().getTargetContext();
Митч
7

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

Prox
источник
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. В тестовом классе замените вашего бегуна на

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

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

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Balsamiq
источник