Android Espresso: не удается разрешить символ AndroidJUnit4.class
Я пытаюсь создать тест Espresso UI в новом проекте Android, но столкнулся со следующей проблемой.
Если я попытался создать пустой тестовый класс:
import android.content.Intent;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {
}
Я всегда получаю это сообщение об ошибке:
cannot resolve symbol AndroidJUnit4.class
И почти все импортированные библиотеки отмечены как неиспользуемые.
Файл
build.gradle содержит следующее:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.some.thing.xxx"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'LICENSE.txt'
}
}
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://jitpack.io" }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.google.android.gms:play-services:7.8.0'
compile 'com.mcxiaoke.volley:library:1.0.18'
compile 'com.orhanobut:logger:1.11'
// App dependencies
compile 'com.android.support:support-annotations:23.0.0'
// TESTING DEPENDENCIES
androidTestCompile 'com.android.support.test:runner:0.3'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.3'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
// add this for intent mocking support
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2'
// add this for webview testing support
androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2'
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2'
}
Если я поместил эти настройки в свой другой тестовый проект, он будет работать, поэтому я не знаю, что может быть неправильным?
Я следил за этим уроком: "
http://www.vogella.com/tutorials/AndroidTestingEspresso/article.html
И я попытался разрешить это, следуя SO-запросу:
Не удается разрешить символ "AndroidJUnit4"
Но без везения.
Большое спасибо за любой совет.
Ответы
Ответ 1
Я тоже пробовал один и тот же учебник из vogella и столкнулся со многими проблемами. Одной из первых проблем, с которыми я столкнулся, было столкновение зависимостей между версиями аннотаций v23 libs и Espresso libs.
Затем я нашел еще один недавно обновленный учебник от Roger Hu "UI Testting with Espresso". Я заметил замечание, что Espresso еще не поддерживает Marshmallow.
Зависимости были добавлены следующим образом:
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2') {
// Necessary if your app targets Marshmallow (since Espresso
// hasn't moved to Marshmallow yet)
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile('com.android.support.test:runner:0.3') {
// Necessary if your app targets Marshmallow (since the test runner
// hasn't moved to Marshmallow yet)
exclude group: 'com.android.support', module: 'support-annotations'
}
Это разрешило конфликт моей зависимости, и я не видел ни одной из оставшихся проблем.
Ответ 2
Я решил его вручную импортировать следующее, я думал, что он должен быть импортирован автоматически, но это не так:
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
Ответ 3
Я решил его с помощью изменения константы
minSdkVersion
до версии 18 в файле build.gradle.
Работает gradle.file:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.something.xxx"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'LICENSE.txt'
}
}
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://jitpack.io" }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.google.android.gms:play-services:7.8.0'
compile 'com.mcxiaoke.volley:library:1.0.18'
compile 'com.orhanobut:logger:1.11'
// TESTING DEPENDENCIES
androidTestCompile 'com.android.support:support-annotations:23.0.0'
androidTestCompile 'com.android.support.test:runner:0.3'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.3'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
// add this for intent mocking support
androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2'
// add this for webview testing support
androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2'
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2'
}
Ответ 4
В соответствии с приведенными выше gradle приведенными изменениями:
androidTestCompile 'com.android.support.test:runner:0.3'
вам нужно изменить на
androidTestCompile('com.android.support.test:runner:0.3') {
exclude group: 'com.android.support', module: 'support-annotations'
}
и для меня он не работал даже с изменением выше, так что я заметил, что я отсутствовал в следующем включении:
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
и это сработало для меня.
Полный файл build.gradle можно найти ниже:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "21.1.2"
lintOptions {
// IMPORTANT: We are disabling this rule to avoid build errors on PrettyTime. Although
//pretty time references an InvalidPackage it does not do it in the code sections we use
//given how easy this library is to use I would prefer not to replace it with something
//like Joda-Time which is overkill for such a small section of the app.
disable 'InvalidPackage'
}
packagingOptions {
exclude 'LICENSE.txt'
}
defaultConfig {
applicationId "co.test.dialer"
minSdkVersion 18
targetSdkVersion 22
versionCode 15
versionName "0.6.15."
renderscriptTargetApi 22
renderscriptSupportModeEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
production {
storeFile file("keystore.jks")
storePassword "hello"
keyAlias "production"
keyPassword "android"
}
debug {
storeFile file("keystore.jks")
storePassword "hello"
keyAlias "debug"
keyPassword "android"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.production
}
debug {
minifyEnabled false
debuggable true
applicationIdSuffix ".debug"
signingConfig signingConfigs.debug
}
internal_test {
minifyEnabled false
debuggable true
applicationIdSuffix ".test"
signingConfig signingConfigs.debug
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:support-v13:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.google.android.gms:play-services-gcm:8.1.0'
compile 'com.jakewharton:butterknife:6.1.0'
compile 'com.afollestad:material-dialogs:0.7.8.0'
compile 'com.googlecode.libphonenumber:libphonenumber:3.1'
compile 'com.mcxiaoke.volley:library:1.0.15'
compile 'squizbit.com.jsonobjectified:jetjson:[email protected]'
compile 'com.google.android.gms:play-services-analytics:8.1.0'
releaseCompile 'co.test.dialersdk:dialersdk:[email protected]';
debugCompile 'co.test.dialersdk:dialersdk-debug:[email protected]';
internal_testCompile 'co.test.dialersdk:dialersdk-internal_test:[email protected]';
androidTestCompile('com.android.support.test:runner:0.3') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile('com.android.support.test:rules:0.3') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
exclude module: 'recyclerview-v7'
}
androidTestCompile('com.android.support.test.espresso:espresso-web:2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}
Надеюсь, это наверняка поможет кому-то, поскольку я боролся полдня, чтобы исправить это, даже после выполнения полных шагов учебника по игре.
Ответ 5
У меня была та же проблема, и я решил изменить свой вариант сборки. Я запускал тест в сборке релизов.
Когда я перешел на "debug" , он работает
Ответ 6
Вы можете обратиться к этому answer.
"Я допустил ошибку, чтобы поместить тестовые классы в src/test. После перемещения их в src/androidTest/java/... зависимость была решена. Возможно, это и ваша проблема".
Ответ 7
Причина, по которой вы получаете это сообщение об ошибке, может быть связана с тем, что ваша папка, в которой находится тест, не соответствует спецификации. Папка должна быть src/androidTest/java.
Взгляните на эту статью, которая гласит...
Запустите контрольно-измерительные приборы для проведения проверок. эти шаги:
Убедитесь, что ваш проект синхронизирован с Gradle, нажав кнопку Sync Проект на панели инструментов. Запустите тест одним из следующих способов: Чтобы запустить один тест, откройте окно "Проект", а затем щелкните правой кнопкой мыши и нажмите "Выполнить". Чтобы проверить все методы в классе, щелкните правой кнопкой мыши класса или метода в тестовом файле и нажмите "Выполнить". Для запуска всех тестов в, щелкните правой кнопкой мыши по каталогу и выберите "Выполнить тесты". Android-плагин для Gradle компилирует контрольный код с инструментами в каталоге по умолчанию (src/androidTest/java/), создается тестовый APK и APK производства, устанавливает оба APK на подключенном устройстве или эмулятор и запускает тесты. Затем Android Studio отображает результаты выполнения инструментального теста в окне "Запуск".
Поэтому люди, для тестирования инструментария должна быть папка (не забывайте об этом случае)
SRC/androidTest/Java
и для локальных тестов папка должна быть
SRC/тест/Java
Затем вы можете создать папку своего пакета, соответствующую вашему приложению
Надеюсь, это поможет сообществу!
Ответ 8
Возможно, у вас может быть несколько типов сборки, по умолчанию Android Project создает два типа сборки (debug/release), вариант изменения варианта для отладки или установки значения ниже
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing
Currently only one Build Type is tested. By default it is the debug Build Type, but this can be reconfigured with:
android {
...
testBuildType "staging"
}