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