redrom
redrom

Reputation: 11632

Android Espresso UI test - Test running failed: Instrumentation run failed due to 'java.lang.IllegalAccessError'

I faced with the following problem:

When i trying to start a stand-alone UI test using Espresso i always get the following console error message without the running the test.

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

So i tried to run command:

 gradle -q dependencies

And i obtained the following result:

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

I tried find the some solution on this topic, but without the luck.

Tests fail after Espresso 2 upgrade (failed: Instrumentation run failed due to 'java.lang.IllegalAccessError')

I don't know what exactly I should to update to make test working.

Here is the app.gradle config file

   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'

    }

And Sample of TEST class:

@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");
    }

}

What should i to change to make this working please? I will glad for any help.

Upvotes: 8

Views: 5322

Answers (4)

Eric
Eric

Reputation: 17536

I ran into a very similar problem.

Mine was caused by an uncaught InterruptedException in some worker thread which stopped the testing process. The stacktrace shows up in the Android Monitor...I was able to solve my problem by catching the exception.

Upvotes: 0

Alexandr Kohanchyk
Alexandr Kohanchyk

Reputation: 1

This means that you have problem in Gradle file. You use wrong dependencies.

I use robotium and JUnit 4 my dependebcies:

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

Upvotes: -1

changhao cui
changhao cui

Reputation: 529

This is a Gradle bug with MultiDex, as discussed in Android issue 194609:

[email protected]:
... it seems that the dependency 'multidex' is added to the app itself and the androidTestCompile apk :(

See: 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

...

Found a workaround, add this to your build.gradle file:

// 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")
            }
        }
    }
}

And, do not use MultiDexTestRunner.

Upvotes: 1

denys
denys

Reputation: 6910

ActivityInstrumentationTestCase2 is deprecated you have to use ActivityTestRule instead:

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

Upvotes: 1

Related Questions