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

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

import android.support.test.runner.AndroidJUnit4;

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

Фон

Я пришел к этому, следуя инструкциям на сайте Android Developer по настройке тестов с использованием 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: зависимости

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

10 ответов

Решение

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

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 была новой, а номера версий здесь сильно устарели.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обратите внимание, что этот 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;

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

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

android {
    ...
    testBuildType "release" 
}

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

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

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

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'
})

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

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

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

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

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

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

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

Та же ошибка возникла у меня, когда я следил за приложением 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

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

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

Android-студия выделит ссылки, отсутствующие в тестовом коде - и появится всплывающее окно 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) в начале моего тестового класса.

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

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

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

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

Добавление

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

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

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

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

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

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