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


139

Очевидно, що для вирішення цієї проблеми мені потрібні правильні дані про імпорт. Згідно з документами для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

Це говорить про те, що ваша збірка відсутня com.android.support.test:runnerпрямо. Чи можете ви підтвердити, gradle dependenciesщо ви все ще втягуєте це після resolutionStrategyзміни?
CommonsWare

@CommonsWare Додано залежності до мого питання. Я не знаю, що (*)означає після com.android.support.test:runner:0.2.
Код-учень

На думку людей з Gradle , зірочка "означає, що деревопогляд графіка залежності скорочено в цей момент, оскільки ця частина графіка вже була перерахована раніше". Я наткнувся на те, чому це не працює для вас.
CommonsWare

1
Зауважте, що відповідь @stemadsen з 2018 року може бути більш актуальною, ніж інші. Хтось одного разу писав про тест, який зберігав питання один і той же рік за роком, але відповіді змінювалися ...
Рой Фолк,

Відповіді:


199

Переконайтесь, що ваш додаток у варіанті збирання налагодження. Перейдіть до збірки> Виберіть варіант складання ... і має з’явитися наступне:

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


5
Дякую, ти врятував мене
Диван

10
Будь здоровий. У документації ніколи не зазначено, що "цей матеріал буде працювати лише у налагодженні". Так засмучує.
Chantell Osejo

27
Ого. Up-Vote x 1 мільйон. Це відповідь, яку я шукав цілими днями. Також знайдено це, щоб ви могли змінити тип складання, який буде використовувати для нього. android { testBuildType "staging"}
WIllJBD

5
Мені доведеться подати звіт про помилку для цього в команду Android Studio Tools. Навіть типи складання, які успадковуються від debugне працюють, якщо явно не встановлено "налагодження"
Gautham C.

1
Нічого, я використовую cutom buildType з initWith (buildTypes.debug) і все ще не працює. Тільки і тільки якщо я використовую налагодження безпосередньо працює!
Каролі

120

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


У моєму випадку моя тестова папка чомусь була src / test, тоді мені довелося перейменувати її на src / androidTest, і це вирішило мою проблему через 3 години ...
Teo Inke

69

Гаразд, ось ваша помилка і моя!

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

Інакше, якщо (!!) ми хочемо написати тест Android Instrumentation Unit, ми повинні помістити наші тестові файли Java в app/src/androidTest/java/your.package.nameкаталог і використовувати анотації, як@RunWith(AndroidJUnit4.class)


Я використовую Maven, що тоді?
JohnyTex

2
@JohnyTex Використання Maven не впливає на мою відповідь. Це залежить лише від вашої структури файлу проекту.
Sepehr Behroozi

34

Оновлення

Тестова бібліотека 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 Test Test була новою, а номери версій тут застаріли.


3
Цікаво, чому документація нічого не згадує з цього приводу, якщо я цього не пропустив. Врятувало б мені горе.
Nom1fan

@Karoly У мене все ще є проблеми. Ви знайшли якесь рішення?
Махді

26

Я вирішив проблему, зробивши невелику зміну у файлі build.gradle програми. У dependencies { ... }розділі обов’язково введіть такий рядок:

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

або будь-яка версія є найновішою на той момент ( ...Compileзастаріла і була замінена на ...Implementation). Зверніть увагу на використання debugImplementation. Android Studio запропонував його автоматично включити androidTestImplementation, що не спрацювало.

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

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


Зауважте, що це скомпілює бібліотеку підтримки тестування в APK.
Код-учень

Також працює з testImplementation "com.android.support.test: правила: 1.0.2"
Prat

10

Зауважте, що це ОП зараз у 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" 
}

Чи можете ви дати більш повне рішення. Я не розумію контексту того, що ти зробив.
Код-учень

Під час тесту еспресо я зіткнувся з проблемою "Не вдається вирішити символ" AndroidJUnit4 "", коли змінив варіант збірки на "випуск". Щойно я додав це твердження (тест "випуск" testBuildType) на рівні програми build.gradle (взято з developer.android.com/studio/test/index.html#add_a_new_test ), ця проблема зникла.
Ендрю Глюхофф

Я відформатував ваш код відповіді у вашій відповіді. Вам слід додати більше деталей, наприклад, посилання з коментаря та описати, куди цей блок йде у вашому проекті.
Код-учень

7

Загальна причина цієї проблеми полягає в тому, що при додаванні нижче залежності:

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

Це правильна залежність, якщо ви збираєтесь використовувати інструментальні тести (тести в androidTestпакеті java)

Але для впровадження тестів локальної одиниці (тестів у testпакеті java) при використанні вищезазначеної залежності; тоді ти зіткнешсяCannot resolve symbol 'AndroidJUnit4'

Це тому, що androidTestImplementationдиректива використовується для імпорту бібліотек в інструментальних тестах, але не в локальних тестах JVM / unit.

Якщо ви хочете використовувати AndroidJUnit4в локальному тесті JVM / unit, замість цього використовуйте нижче залежність

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

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


1
У сценарії в моєму первісному запитанні я проводив інструментальні тести. Однак це велика відмінність і, сподіваємось, допоможе відвідувачам у цьому питанні в майбутньому.
Код-учень

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
Коли я писав це питання, я ще не додав еспресо як залежність для одиничних тестів.
Код-учень

+1 Я насправді зрозумів це прямо до того, як побачив це, але так, саме це я і зробив, і це вирішило мою проблему.
Тоні Д

2
Дотримуйтесь двох відповідей нижче від @sepehr. Клас AndroidJunit4 не в пакеті еспресо, наполягаючи на його присутніх в android.support.test.runner пакет. і все, що вам потрібно зробити, це включити @Runwith (AndroidJunit4.class) - написати вище / для тестового випадку, присутнього в src / Androidtest / java, ВСТАНОВЛЕНО включно у тестових випадках, написаних під src / test / java.
Хай

2

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

Для , наприклад: Якщо ви використовуєте збірки типу налагодження , то ви повинні додати android{testBuildType "debug" }, якщо використовуються етап потім додати android{testBuildType "stage"}заяву в андроїд тезі.


Чи пропонуєте ви відредагувати файл збірки, якщо ви хочете переключити тестований варіант?
nasch


1

Класичний недійсний кеш / перезапуск мені допоміг! :)


1

Додайте цю залежність у файл build.gradle:

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

Оновіть кінцеву версію ( 1.1.1) з останньою випущеною версією.


0

Додавання

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

вирішив саме це питання для мене.


Про це вже сказано у прийнятій відповіді. Ви також повинні побачити, чи є новіша версія, і використовувати її замість цього.
Код-учень

Чи androidTestCompile збігається з компіляцією?
donlys

compileдирективи залежності імен, що використовуються в головному додатку, а androidTestComipleімена залежностей, які використовуються для тестування. Тож правильною відповіддю є використання androidTestCompile, а не compile.
Код-учень

0

Як показує список відповідей, це може бути викликано кількома речами. Ще один для списку:

Я запустив надто ревний 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)на початку мого тестового класу.


Чи можете ви показати приклад тесту, де це сталося для вас?
Код-учень

0

Коротка версія історії:

Оновіть Gradle до останньої версії

Я відповідаю на це запитання 15 лютого 2020 року. На жаль, я вичерпав усі можливі рішення, згадані тут і в інших місцях.

Так, жоден з них не працює. Я використовую вбудовану функцію "Перехід на Andoridx", це може нагадувати мені, що мені потрібно оновити цільові версії SDK і свою версію gradle. Після того як я модернізував свою версію gradle з 2.0.2 до 3.5.3. Вони просто працюють, навіть стара заява про імпорт працює.


Привіт, це старе запитання вже має прийняту відповідь, і я не бачу, як ваша відповідь додає нічого нового до питання. Будь ласка, уникайте відповідей, якщо ваша відповідь не додає нічого нового до існуючих відповідей. Дякую
гіпоподіпос

Прийнята відповідь дає посилання на оновлення залежностей тестування до бібліотеки тестування AndroidX. Це, мабуть, річ, яка зафіксувала це у всіх речах, які ви пробували.
Код-учень

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.