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