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'

Но без удачи.

Большое спасибо за любые советы.

8 ответов

Я попробовал ту же самую инструкцию от vogella и столкнулся со многими проблемами. Одной из первых проблем, с которыми я столкнулся, было столкновение зависимостей между версиями аннотаций библиотек v23 и библиотек Espresso.

Затем я нашел еще один недавно обновленный учебник от Роджера Ху " Тестирование пользовательского интерфейса с помощью эспрессо". Я заметил замечание, что эспрессо еще не поддерживает зефир.

Зависимости были добавлены следующим образом:

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

Это решило мой конфликт зависимости, и я не видел ни одной из остальных проблем.

Я решил это, вручную импортировав следующее, я думал, что он должен быть импортирован автоматически, но это не так:

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;

Причина, по которой вы получаете это сообщение об ошибке, может заключаться в том, что ваша папка, в которой находится тест, не соответствует спецификации. Папка должна быть src / androidTest / java.

Взгляните на эту статью, в которой говорится...

Запустите инструментированные модульные тесты Для запуска ваших инструментальных тестов выполните следующие действия:

Убедитесь, что ваш проект синхронизирован с Gradle, нажав Синхронизировать проект на панели инструментов. Запустите тест одним из следующих способов: чтобы запустить один тест, откройте окно "Проект", затем щелкните тест правой кнопкой мыши и выберите "Выполнить". Чтобы протестировать все методы в классе, щелкните правой кнопкой мыши класс или метод в тестовом файле и выберите "Выполнить". Чтобы запустить все тесты в каталоге, щелкните правой кнопкой мыши каталог и выберите "Запустить тесты". Плагин Android для Gradle компилирует инструментированный тестовый код, расположенный в каталоге по умолчанию (src/androidTest/java/), создает тестовый APK и рабочий APK, устанавливает оба APK на подключенное устройство или эмулятор и запускает тесты. Затем Android Studio отображает результаты выполнения инструментированного теста в окне "Выполнить".

Поэтому, ребята, для контрольно-измерительной аппаратуры папка должна быть (не забудьте случай)

SRC / androidTest / Java

и для локальных тестов папка должна быть

SRC / тест / Java

После этого вы можете иметь свои папки для пакетов, соответствующие вашему пакету приложений.

Надеюсь, это поможет сообществу!

Я решил это с помощью изменения константы

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

В соответствии с вышеуказанными изменениями 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:1.0.3@aar'
    compile 'com.google.android.gms:play-services-analytics:8.1.0'

    releaseCompile 'co.test.dialersdk:dialersdk:1.0.8@aar';
    debugCompile 'co.test.dialersdk:dialersdk-debug:1.0.8@aar';    
    internal_testCompile 'co.test.dialersdk:dialersdk-internal_test:1.0.8@aar';

    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'


}

Надеюсь, это наверняка поможет кому-то, так как я изо всех сил боролся за полдня, чтобы исправить это, даже после того, как я выполнил полные шаги по обучению vogella.

Возможно, у вас может быть несколько типов сборки, Android-проект по умолчанию создает два типа сборки (отладка / выпуск), измените вариант сборки на отладку или установите значение, как показано ниже

http://tools.android.com/tech-docs/new-build-system/user-guide

Currently only one Build Type is tested. By default it is the debug Build Type, but this can be reconfigured with:
android {
    ...
    testBuildType "staging"
}

У меня была та же проблема, и я решил изменить свой вариант сборки. Я выполнял тест в сборке релиза.

Когда я переключился на "отладку", это работает

Вы можете обратиться к этому ответу.

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

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