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

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

@RunWith(AndroidJUnit4.class)

из

import androidx.test.runner.AndroidJUnit4;

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

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

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

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

stackoverflow.com/questions/43342831/…
IntelliJ Amiya 12.10.2018 11:44

Я думаю, что ваш источник устарел, они вообще не упоминают androidx.

Marcel Gangwisch 12.10.2018 11:48

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

Rupert Rawnsley 04.10.2019 16:08
312
3
74 269
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

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

  1. Файл gradle должен содержать следующую строку:

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

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

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

мой градиент имеет это и до сих пор не может решить проблему.

zuko 01.12.2018 19:10

@zuko Очистите и / или перестройте свой проект, он должен быть там. Если все еще нет и вы используете модули, убедитесь, что ваша иерархия зависимостей настроена так, как вы ожидаете; вам может потребоваться добавить их и к модулям верхнего уровня, поскольку библиотеки тестирования не компилируются в общие модули для использования вышестоящими модулями.

Jon Adams 28.12.2018 02:58

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

zuko 29.12.2018 21:50

Должны ли мы также изменить testInstrumentationRunner в файле градиента с androidx.test.runner.AndroidJUnitRunner на androidx.test.ext.junit.runners.AndroidJUnit4? Просто интересно, есть ли несоответствие.

A Droid 02.02.2019 10:17

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

Xplosive 08.02.2019 20:15

новое имя пакета для AndroidJUnit4 - import androidx.test.ext.junit.runners.AndroidJUnit4. Если у вас есть собственно build.app, то это должно быть неправильное имя пакета. Обратите внимание, что студия Android не делает этого самостоятельно. По крайней мере, не та версия, которую я использую, Android Studio 3.3, обновленная 25 декабря 2018 г.

Muhammad Ahmed AbuTalib 26.03.2019 11:22

@ marcel-gangwisch Где в связанном документе говорится об использовании этой зависимости?

Juan C Nuno 17.07.2019 22:33

@Xplosive, вы должны отредактировать ответ, чтобы включить свой комментарий

Davide 28.08.2019 10:23

Если бы эта проблема дважды возникала при создании новых проектов и добавлении «androidx.test.ext: junit: 1.1.1» решила ее, просто не забудьте удалить старый импорт из каталога «androidTest» и повторно синхронизировать проект.

JimmyFlash 29.11.2019 10:26

Также стоит отметить, что androidTest строит только для конкретного варианта и по умолчанию отлаживать. Это означает, что он не может разрешить AndroidJUnit4, когда целевой вариант находится в режиме выпуска если ты не переключишься. Это беспощадно непрозрачное поведение.

Rupert Rawnsley 04.06.2020 12:47

огромное спасибо, похоже, у меня работает.

Tonnie 27.03.2021 15:51

Как упоминал @RupertRawnsley, использование androidTestImplementation добавляет указанную библиотеку в путь к классу для варианта сборки Debug только при выполнении тестов Instrumentation (UI). Если вы используете Roboelectric, например, вы можете пытаться использовать @RunWith(AndroidJUnit4::class) из локальных модульных тестов, которые запускаются с использованием JVM и не требуют запуска эмулятора. Подробнее здесь

Jadent 14.07.2021 11:03

В моем случае помогла замена androidTestImplementation на testImplementation. Я не знал разницы до того, как прочитал этот Android разница между testImplementation и androidTestImplementation в build.gradle

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

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

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

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

Для модульных тестов:

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

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

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

Для меня сработали следующие шаги:
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.

@RunWith(AndroidJUnit4ClassRunner.class) был той частью, которая решила проблему в моем случае. Я действительно не понимаю, почему студия Android иногда генерирует устаревший код.
Rafsanjani 18.06.2019 12:08

Используйте ApllicationProvider.getApplicationContext<Context>() вместо InstrumentationRegistry.getInstrumentation().getTargetContex‌​t();

Mitch 20.09.2019 18:37

Если вы импортировали эти тестовые библиотеки AnroidX, синхронизировали и перестроили проект, но импортированные пакеты все еще не были разрешены. Просто вспомните, как вы обновили свой проект до AndroidX, закройте Android Studio, удалите папку .idea и снова откройте свой проект. ...

Это сработало для меня!

Решение

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

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

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

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

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

  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 ()

Другие вопросы по теме