Тест пользовательского интерфейса Android Espresso - Ошибка выполнения теста: сбой при запуске инструментария из-за ошибки 'java.lang.IllegalAccessError'

Я столкнулся со следующей проблемой:

Когда я пытаюсь запустить автономный тест пользовательского интерфейса с помощью Espresso, я всегда получаю следующее сообщение об ошибке консоли без запуска теста.

Test running startedTest running failed: Instrumentation run failed due to 'java.lang.IllegalAccessError'
Empty test suite.

Итак, я попытался запустить команду:

 gradle -q dependencies

И я получил следующий результат:

androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.android.support:support-annotations:23.0.1
+--- com.android.support.test:runner:0.3
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.3
|    +--- junit:junit:4.12
|    |    \--- org.hamcrest:hamcrest-core:1.3
|    \--- com.android.support:support-annotations:22.2.0 -> 23.0.1
+--- com.android.support.test:rules:0.3
|    \--- com.android.support.test:runner:0.3 (*)
+--- com.android.support.test.espresso:espresso-core:2.1 -> 2.2
|    +--- com.android.support.test.espresso:espresso-idling-resource:2.2
|    +--- com.squareup:javawriter:2.1.1
|    +--- javax.inject:javax.inject:1
|    +--- org.hamcrest:hamcrest-library:1.3
|    |    \--- org.hamcrest:hamcrest-core:1.3
|    +--- com.android.support.test:rules:0.3 (*)
|    +--- org.hamcrest:hamcrest-integration:1.3
|    |    \--- org.hamcrest:hamcrest-library:1.3 (*)
|    +--- com.google.code.findbugs:jsr305:2.0.1
|    +--- javax.annotation:javax.annotation-api:1.2
|    \--- com.android.support.test:runner:0.3 (*)
+--- com.android.support.test.espresso:espresso-intents:2.2
|    \--- com.android.support.test.espresso:espresso-core:2.2 (*)
+--- com.android.support.test.espresso:espresso-web:2.2
|    +--- org.ccil.cowan.tagsoup:tagsoup:1.2
|    +--- com.android.support:support-annotations:22.2.0 -> 23.0.1
|    \--- com.android.support.test.espresso:espresso-core:2.2 (*)
+--- com.android.support.test.uiautomator:uiautomator-v18:2.1.1
+--- com.android.support.test.espresso:espresso-contrib:2.2
|    +--- com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0
|    |    \--- org.hamcrest:hamcrest-core:1.3
|    +--- com.android.support:support-v4:22.2.0
|    |    \--- com.android.support:support-annotations:22.2.0 -> 23.0.1
|    +--- com.android.support:recyclerview-v7:22.2.0
|    |    +--- com.android.support:support-annotations:22.2.0 -> 23.0.1
|    |    \--- com.android.support:support-v4:22.2.0 (*)
|    \--- com.android.support.test.espresso:espresso-core:2.2 (*)
\--- com.android.support:multidex-instrumentation:1.0.1

Я попытался найти какое-то решение по этой теме, но безуспешно.

Тесты завершаются неудачно после обновления Espresso 2 (не удалось : Инструментальный запуск не удался из-за 'java.lang.IllegalAccessError')

Я не знаю, что именно мне нужно обновить, чтобы тест заработал.

Вот конфигурационный файл app.gradle

   android {
        compileSdkVersion 23
        buildToolsVersion "23.0.0"

        defaultConfig {
            applicationId "test.my.app"
            minSdkVersion 18
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            // Enabling multidex support.
            multiDexEnabled true
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        lintOptions {
            abortOnError false
        }
        packagingOptions {
            exclude 'LICENSE.txt'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
        }
    }


    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://repo.commonsware.com.s3.amazonaws.com" }
        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.1'
        compile 'com.google.android.gms:play-services:7.8.0'
        compile 'com.mcxiaoke.volley:library:1.0.18'
        compile 'com.orhanobut:logger:1.11'
        compile 'com.google.code.gson:gson:2.3.1'
        compile 'com.android.support:design:23.0.1'
        // UI TESTING DEPENDENCIES
        androidTestCompile 'com.android.support:support-annotations:23.0.1'
        androidTestCompile 'com.android.support.test:runner:0.3'
        androidTestCompile 'com.android.support.test:rules:0.3'
        //androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
        androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
        androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2'
        androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2'
        androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
        androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2'
        androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
            exclude group: 'com.android.support', module: 'multidex'
        }
        // ORM DATABASE DEPENDENCIES
        compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
        // STETHO CORE
        compile 'com.facebook.stetho:stetho:1.1.1'
        compile 'com.facebook.stetho:stetho-urlconnection:1.1.1'
        compile 'com.facebook.stetho:stetho-okhttp:1.1.1'
        // GOOGLE ANALYTICS
        compile 'com.google.android.gms:play-services-analytics:7.8.0'
        // JODA TIME FOR ANDROID
        compile 'net.danlew:android.joda:2.8.2'
        // SECURE SHARED PREFERENCES
        compile 'com.scottyab:secure-preferences-lib:0.1.3'
        // MATERIAL DIALOG
        compile 'com.avast:android-styled-dialogs:2.2.0'
        // SQL CIPHER
        compile 'com.commonsware.cwac:sqlcipher-for-android:3.3.1'
        // HTML PARSER
        compile 'org.jsoup:jsoup:1.8.3'
        // MULTIDEX SUPPORT
        compile 'com.android.support:multidex:1.0.1'
        // SECOND MATERIAL DIALOG
        compile('com.afollestad.material-dialogs:core:0.8.1.0@aar') {
            transitive = true
        }
        compile('com.afollestad.material-dialogs:commons:0.8.0.1@aar') {
            transitive = true
        }
        // ANDROID BOOTSTRAP
        compile 'com.beardedhen:androidbootstrap:2.0.0'

    }

И образец класса ТЕСТ:

@RunWith(AndroidJUnit4.class)
public class SignInActivityTest extends ActivityInstrumentationTestCase2<SignInActivity> {

    public TestHelper tl = new TestHelper();
    public SignInActivityTest() {
        super(SignInActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        SignInActivity lActivity = getActivity();
    }

    // Insert scenario methods here
    @Test
    public void processTest() throws InterruptedException {

        // TODO: strings which are inserted into inputs should be defined as the string constants
        // Discuss it with Jan Sedlacek.
        tl.insertTextIntoInput(R.id.login_txv_username, "test");
        tl.insertTextIntoInput(R.id.login_txv_password, "test");
    }

}

Что мне нужно изменить, чтобы это работало? Буду рад любой помощи.


person redrom    schedule 16.10.2015    source источник
comment
тебе удалось это исправить? Я столкнулся с той же проблемой. вместо этого мой тест фактически расширял AndroidTestCase.   -  person Thuy Trinh    schedule 02.12.2015
comment
У меня такая же проблема. Любое решение по этому поводу?   -  person dawid gdanski    schedule 12.02.2016


Ответы (4)


ActivityInstrumentationTestCase2 устарел, вместо этого следует использовать ActivityTestRule:

@RunWith(AndroidJUnit4.class)
public class SignInActivityTest {
    @Rule
    public ActivityTestRule<SignInActivity> mActivityRule = new ActivityTestRule(SignInActivity.class);

    public TestHelper tl = new TestHelper();

    @Before
    public void setUp() throws Exception {
        //currently you don't use Activity instance in your tests
        //I just put it here as an example how to get the activity from ActivityTestRule
        SignInActivity lActivity = mActivityRule.getActivity();
    }

    // Insert scenario methods here
    @Test
    public void processTest() throws InterruptedException {
        tl.insertTextIntoInput(R.id.login_txv_username, "test");
        tl.insertTextIntoInput(R.id.login_txv_password, "test");
    }

    @After
    public void tearDown() throws Exception {
        //do some stuff if needed
    }
}
person denys    schedule 20.10.2015
comment
ох, это безумие, я второй раз подряд натыкаюсь на твой ответ за 2 дня xD - person lelloman; 18.09.2018

Это ошибка Gradle с MultiDex, как описано в проблеме с Android 194609:

m ... @ felixschulze.de:
... похоже, что зависимость multidex добавлена ​​в само приложение и apk androidTestCompile :(

См.: https://android.googlesource.com/platform/tools/base/+/studio-1.5/build-system/gradle-core/src/main/groovy/com/android/build/gradle./internal/VariantManager.java#419

...

Нашел обходной путь, добавьте это в свой файл build.gradle:

// Workaround for Multidex bug in gradle-android-plugin
// Replace Multidex dependency with some dummy dependency to avoid dex problems
// @see https://code.google.com/p/android/issues/detail?id=194609
project.getConfigurations().all { config ->
    if (config.name.contains("AndroidTest")) {
        config.resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.name == "multidex") {
                details.useTarget("de.felixschulze.teamcity:teamcity-status-message-helper:1.2")
            }
        }
    }
}

И не используйте MultiDexTestRunner.

person changhao cui    schedule 08.03.2016

Я столкнулся с очень похожей проблемой.

Моя была вызвана неперехваченным InterruptedException в каком-то рабочем потоке, который остановил процесс тестирования. Трассировка стека отображается в _2 _... Я смог решить свою проблему, перехватив исключение.

person Eric    schedule 07.02.2017

Это означает, что у вас проблема с файлом Gradle. Вы используете неправильные зависимости.

Я использую robotium и JUnit 4 мои зависимости:

 dependencies {
     androidTestCompile fileTree(dir: 'libs', include: 'robotium-solo-5.5.4.jar')
     androidTestCompile 'junit:junit:4.12'
     androidTestCompile 'com.android.support.test:runner:0.4'
     // Set this dependency to use JUnit 4 rules
     androidTestCompile 'com.android.support.test:rules:0.4'
 }
person Alexandr Kohanchyk    schedule 08.06.2016