Не удается разрешить символ "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, что не сработало.

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

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

Stemadsen
источник
Обратите внимание, что это скомпилирует библиотеку поддержки тестирования в 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;

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

leonidaa
источник
@ 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'; потому что вы используете неправильную директиву.

Zain
источник
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'
tm81
источник
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.
Хай
3

Переместите тестовый класс в src / androidTest / java /. Тогда зависимость исчезнет.

Комал Нихаре
источник
2

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

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

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

Классический Invalidate Cache / Restart мне помог! :)

user_MGU
источник
1

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

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

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

KOUSHIKZEP99
источник
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)в начале моего тестового класса.

Winwaed
источник
Можете ли вы показать пример теста, где это произошло с вами?
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 вашего приложения. По ошибке удалил и тест перестал работать.

Шубхам Гоэль
источник