Не удается разрешить символ "AndroidJUnit4"


143

Очевидно, мне нужен правильный статус импорта для решения этой проблемы. Согласно документацииAndroidJUnit4 , это должно быть

import android.support.test.runner.AndroidJUnit4;

Когда я это делаю, Android Studio выделяется runnerкрасным цветом и жалуется: «Не удается разрешить символ« бегун »».

Задний план

Я дошел до этого, следуя руководствам на сайте разработчиков Android по настройке тестов с помощью UI Automator . Первая проблема , которую я столкнулся в том , что com.android.support:support-v4:22.2.0и com.android.support.test:runner:0.2зависят от разных версий com.android.support:support-annotations. Я последовал предложениям из этого отчета об ошибке Android и добавил allprojectsв свой проект следующее build.gradle:

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}

Это решило непосредственную ошибку, но я подозреваю, что это привело к моим текущим проблемам. Есть ли у кого-нибудь предложения, как это исправить?

Повторные разделы из `./gradlew: app: dependencies

androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.jayway.android.robotium:robotium-solo:5.2.1
+--- com.squareup:fest-android:1.0.8
|    \--- org.easytesting:fest-assert-core:2.0M10
|         \--- org.easytesting:fest-util:1.2.5
+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0 -> 22.2.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.uiautomator:uiautomator-v18:2.1.0

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.2.0
|    \--- com.android.support:support-v4:22.2.0
|         \--- com.android.support:support-annotations:22.2.0
+--- com.android.support:support-v4:22.2.0 (*)
+--- com.google.android.gms:play-services:6.1.71
|    \--- com.android.support:support-v4:20.0.0 -> 22.2.0 (*)
+--- com.crashlytics.android:crashlytics:1.+ -> 1.1.13
\--- com.jakewharton:butterknife:5.1.2

Это говорит о том, что ваша сборка com.android.support.test:runnerполностью отсутствует . Можете ли вы подтвердить, gradle dependenciesчто вы все еще используете это после resolutionStrategyизменения?
— CommonsWare 02

@CommonsWare В мой вопрос добавлен вывод зависимостей. Я не знаю, что (*)значит после com.android.support.test:runner:0.2.
— Code-Apprentice

По словам разработчиков Gradle , звездочка «означает, что древовидное представление графа зависимостей прервано на этом этапе, потому что эта часть графа уже была указана ранее». Я не понимаю, почему это не работает для вас.
— CommonsWare 02

1
Обратите внимание, что ответ @stemadsen от 2018 года потенциально более актуален, чем другие. Кто-то однажды написал о тесте, который год за годом сохранял одни и те же вопросы, но ответы менялись ...
— Рой Фальк

Ответы:


204

Убедитесь, что ваше приложение находится в варианте отладки. Перейдите в Build> Select Build Variant ... и должно появиться следующее:

введите описание изображения здесь


5
Спасибо, ты спас меня
— Софа

10
Будьте здоровы. В документации никогда не говорится, что «этот материал будет работать только при отладке». Так обидно.
— Chantell Osejo

27
Вау. Поддерживающее голосование x 1 миллион. Это ответ, который я искал несколько дней. Также нашел это, чтобы вы могли изменить, какой тип сборки использовать для него. android { testBuildType "staging"}
— WIllJBD

5
Мне нужно будет отправить отчет об ошибке в команду Android Studio Tools. Даже типы сборки, унаследованные от debug, не работают, если явно не установлено значение «отладка»
— Гаутам С.

1
вау, я использую buildType cutsom с initWith (buildTypes.debug) и все равно не работает. Только и только если я использую отладку напрямую, работает!
— Karoly

120

Я сделал ошибку, поместив тестовые классы в src / test . После их перемещения в src / androidTest / java / зависимость была устранена.


В моем случае моя тестовая папка по какой-то причине была src / test, затем мне пришлось переименовать ее в src / androidTest, и это решило мою проблему через 3 часа ...
— Тео Инке

72

Итак, вот ваша и моя ошибка!

Если мы собираемся написать кусок кода для локального модульного тестирования, мы не должны использовать его, @RunWith(AndroidJUnit4.class)потому что мы не используем AndroidJUnit4, но нам нужен Junit4. так что мы должны написать @RunWith(JUnit4.class). И, конечно же, ваш тестовый файл java находится в app/src/test/java/your.package.nameкаталоге.

В противном случае, если (!!) мы хотим написать какой-нибудь инструментальный модульный тест Android, мы должны поместить наши тестовые java-файлы в app/src/androidTest/java/your.package.nameкаталог и использовать аннотацию, например@RunWith(AndroidJUnit4.class)


Я использую Maven, что тогда?
— JohnyTex 01

2
@JohnyTex Использование Maven не влияет на мой ответ. Это зависит только от файловой структуры вашего проекта.
— Sepehr Behroozi

35

Обновить

Библиотека тестов Android теперь является частью AndroidX. Обязательно используйте правильные зависимости Gradle, найденные в официальной документации .

Оригинальный ответ

Я нашел здесь , что есть более новые версии библиотеки поддержки тестирования , чем то , что я использовал:

dependencies {
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

Примечание. Обязательно используйте самые последние версии этих библиотек. Этот вопрос возник в то время, когда библиотека поддержки тестов Android была новой, а номера версий здесь очень устарели.


3
Интересно, почему в документации об этом ничего не говорится , если только я не пропустил. Спас бы меня от горя.
— Nom1fan

@Karoly У меня все еще проблема. Вы нашли какое-нибудь решение?
— Махди

Официальная документация, ссылка на которую есть в ответе, не перечисляет необходимые зависимости Gradle. К счастью, инструмент Migrate to AndroidX может преобразовывать зависимости в ответе на:dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' }
— user2623008

1
@ user2623008 Этот ответ был написан задолго до создания androidxпространства имен. Спасибо за обновления.
— Code-Apprentice

26

Я решил проблему, внеся небольшое изменение в файл build.gradle приложения. В dependencies { ... }разделе обязательно укажите следующую строку:

debugImplementation 'com.android.support.test:runner:1.0.1'

или любая другая версия является самой новой на тот момент ( ...Compileустарела и была заменена на ...Implementation). Обратите внимание на использование debugImplementation. Android Studio предложила автоматическое включение androidTestImplementation, что не сработало.

Я узнал, как изменить его с теста на отладку, посмотрев в структуре проекта в разделе «Зависимости» модуля приложения, где вы можете изменить объем каждой зависимости, см. Ниже.

Структура проекта


Обратите внимание, что это скомпилирует библиотеку поддержки тестирования в APK.
— Code-Apprentice

Также работает с testImplementation "com.android.support.test: rules: 1.0.2"
— Прат

10

Обратите внимание, что этот OP сейчас в 2019 году, ему 4 года, поэтому, если вы используете Android X, он AndroidJUnit4.classустарел, у вас есть ошибка и еще одна ошибка androidx.test.ext.junit.runners.AndroidJUnit4. Предлагаю прочитать эти ссылки, чтобы решить проблему.

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

Перенос тестов Junit4 на androidx: почему не удалось загрузить бегун делегата? Мне Android Studio предложила заменить

@RunWith(AndroidJUnit4.class)

который устарел с

@RunWith(AndroidJUnit4ClassRunner.class)

и это

androidx.test.ext.junit.runners.AndroidJUnit4

с этим

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;

После этого ошибка исчезла, но я не знаю, нормально ли будет работать будущий тест ?!


@ Code-Apprentice - Большое спасибо за редактирование, теперь он стал намного лучше
— leonidaa

8

В моем случае это помогло для варианта выпуска:

android {
    ...
    testBuildType "release" 
}

Можете дать более полное решение. Я не понимаю контекста того, что вы сделали.
— Code-Apprentice

Я столкнулся с проблемой «Невозможно разрешить символ« AndroidJUnit4 »» в моем тесте эспрессо, когда я изменил вариант сборки на «выпуск». Как только я добавил этот оператор (testBuildType «release») в build.gradle уровня приложения (взятый из developer.android.com/studio/test/index.html#add_a_new_test ), эта проблема исчезла.
— Эндрю Глухофф

Я отформатировал ваш ответ код в ваш ответ. Вы должны добавить больше деталей, например ссылку из вашего комментария, и описать, где этот блок находится в вашем проекте.
— Code-Apprentice

7

Распространенной причиной этой проблемы является то, что при добавлении зависимости ниже:

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

Это правильная зависимость, если вы собираетесь использовать инструментальные тесты (тесты в androidTestпакете java).

Но для реализации локальных модульных тестов (тестов в testпакете java) при использовании вышеупомянутой зависимости; тогда ты столкнешьсяCannot resolve symbol 'AndroidJUnit4'

Это связано с тем, что androidTestImplementationдиректива используется для импорта библиотек в инструментальных тестах, но не в локальных JVM / модульных тестах.

Если вы хотите использовать AndroidJUnit4в локальном JVM / модульном тесте, используйте вместо этого зависимость ниже

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

То же самое применимо, если вы добавите последнюю зависимость при использовании AndroidJUnit4в инструментальном тесте, вы также получите Cannot resolve symbol 'AndroidJUnit4'; потому что вы используете неправильную директиву.


1
В сценарии моего исходного вопроса я проводил инструментальные тесты. Тем не менее, это важное различие, которое, надеюсь, поможет посетителям ответить на этот вопрос в будущем.
— Code-Apprentice,

5

Если у кого-то все еще есть эта проблема:

Не удается разрешить символ "AndroidJUnit4"

и используя API 27, build.gradleкоторый находится в модуле приложения, добавьте следующие строки:

testImplementation 'junit:junit:4.12'

// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'

// Espresso dependencies
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

3

поместите этот код в свои зависимости

compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})

1
Когда я писал этот вопрос, я еще не добавлял эспрессо в качестве зависимости для модульных тестов.
— Code-Apprentice

+1 Я действительно понял это прямо перед тем, как увидел это, но да, это то, что я сделал, и это решило мою проблему.
— Tony D

2
Следуйте двум приведенным ниже ответам от @sepehr. Класс AndroidJunit4 не находится в пакете эспрессо, а присутствует в пакете android.support.test.runner. и все, что вам нужно сделать, это включить @Runwith (AndroidJunit4.class), записанный выше / для тестового примера, присутствующего в src / Androidtest / java, INSTED OF, включая тестовые примеры, написанные в src / test / java.
— Хай


2

Если вы используете проект с несколькими типами сборки, то выбранный тип сборки в окне вариантов сборки необходимо указать с помощью тега testBuildType в файле build.gradle модуля.

Например: если вы используете отладку типа сборки, вам следует добавить android{testBuildType "debug" }, если вы используете этап, добавьте android{testBuildType "stage"}оператор в тег Android.


Вы предлагаете отредактировать файл сборки, если хотите переключить тестируемый вариант?
— nasch


1

Добавьте эту зависимость в свой файл build.gradle:

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

Обновите конечную версию ( 1.1.1) до последней выпущенной версии.


0

Добавление

compile com.android.support.test:runner:0.5'

решил эту проблему для меня.


Об этом уже сказано в принятом ответе. Вы также должны увидеть, есть ли более новая версия, и использовать ее вместо нее.
— Code-Apprentice

AndroidTestCompile совпадает с компиляцией?
— donlys 01

compileДирективы именуют зависимости, используемые в основном приложении, а androidTestComipleимена зависимостей, используемые для тестирования. Так что правильный ответ - использовать androidTestCompile, а не compile.
— Code-Apprentice

0

Как видно из списка ответов, это может быть вызвано несколькими причинами. Еще одно для списка:

Я слишком усердно запустил LINT, который удалил весь неиспользуемый импорт. Это приведет к тем же ошибкам, и легко не заметить, что это проблема.

Android-studio выделит ссылки, которые отсутствуют в тестовом коде - и появится всплывающее окно ALT-ENTER (это то, что легко пропустить).

Затем мне нужно удалить тесты из LINT - или хотя бы отключить это предупреждение.

Изменить: @ Code-Apprentice, отсутствующие строки:

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;


import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

Итак, первая ошибка в файле была @RunWith(AndroidJUnit4.class)в начале моего тестового класса.


Можете ли вы показать пример теста, где это произошло с вами?
— Code-Apprentice

0

Краткая версия рассказа:

Обновите Gradle до последней версии

Я отвечаю на этот вопрос от 15 февраля 2020 г. К сожалению, я исчерпал все возможные решения, упомянутые здесь и в других местах.

Да, ни один из вышеперечисленных не работает. Я использую встроенную функцию «Migrate to Andoridx», она может напоминать мне, что мне нужно обновить свои целевые версии SDK и версию Gradle. После того, как я обновил свою версию gradle с 2.0.2 до 3.5.3. Они просто работают, даже старый оператор импорта работает.


Привет, это старый вопрос, на который уже есть принятый ответ, и я не вижу, как ваш ответ добавляет что-то новое к вопросу. Пожалуйста, не отвечайте, если ваш ответ не добавляет ничего нового к существующим ответам. Спасибо
— hippozhipos

В принятом ответе есть ссылка для обновления тестовых зависимостей в библиотеке AndroidX Testing. Вероятно, это то, что исправило его во всех вещах, которые вы пробовали.
— Code-Apprentice

0

Та же ошибка возникла у меня, когда я следил за приложением Google IOSched и настраивал свой проект с тремя типами сборки [отладка, выпуск, постановка], где отладка и выпуск используют один и тот же исходный каталог.

sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

В этом случае укажите testBuildTypeв файле build.gradle на уровне модуля, и теперь проект должен иметь возможность разрешать символ «AndroidJUnit4».

...
sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

testBuildType "staging"
...

Ссылка: https://github.com/google/iosched/blob/master/mobile/build.gradle


0

Убедитесь, что у вас есть

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

зависимости в файле build.gradle вашего приложения. По ошибке удалил и тест перестал работать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.