Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issues running Espresso instrument tests on Dalvik runtime devices

I'm running across a similar issue to FragmentActivity can not be tested via ActivityInstrumentationTestCase2

The problem with the top solution there is that only applies to using the Eclipse build system. I'm using Gradle for my project.

On my Nexus 5 running the ART runtime, my Espresso instrument tests run perfectly. When I use a Nexus 4 on the Dalvik runtime or an emulator, I run into an exception that doesn't occur when running the app outside of the testing framework.

java.lang.NoClassDefFoundError: com.packagename.fragment.ProgressDialogFragment

In the logs, I find these suspicious messages similar to the linked question:

Class resolved by unexpected DEX: Landroid/support/v4/app/DialogFragment2;(0x41e969d8):0x76064000 ref [Landroid/support/v4/app/DialogFragment;] Landroid/support/v4/app/DialogFragment;(0x41e969d8):0x75883000
(Landroid/support/v4/app/DialogFragment2; had used a different Landroid/support/v4/app/DialogFragment; during pre-verification)
Unable to resolve superclass of Landroid/support/v4/app/DialogFragment2; (271)
Link of class 'Landroid/support/v4/app/DialogFragment2;' failed
Unable to resolve superclass of Lcom/packagename/fragment/ProgressDialogFragment; (270)
Link of class 'Lcom/packagename/fragment/ProgressDialogFragment;' failed
Could not find method com.packagename.fragment.ProgressDialogFragment.newInstance, referenced from method com.packagename.activity.IntroActivity.doJoin
VFY: unable to resolve static method 47365: Lcom/packagename/fragment/ProgressDialogFragment;.newInstance (I)Landroid/support/v4/app/DialogFragment2;
VFY: replacing opcode 0x71 at 0x0063

ProgressDialogFragment is a subclass of DialogFragment2 which is a subclass of the Android support library's DialogFragment class

Here are the dependencies in my Gradle file if that helps:

    compile 'com.android.support:support-v4:+'
    compile 'com.android.support:appcompat-v7:+'

    compile 'com.google.android.gms:play-services:+'

    compile 'com.google.code.findbugs:jsr305:+'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.3.+'
    compile 'de.greenrobot:greendao:1.3.+'

    compile 'fr.avianey:facebook-android-api:+@aar'

    compile 'com.squareup.mimecraft:mimecraft:1.1.+'
    compile 'com.squareup.picasso:picasso:2.2.+'
    compile 'com.squareup.okhttp:okhttp:1.5.+'

    compile 'eu.inmite.android.lib:android-styled-dialogs:1.1.+@aar'

    compile 'com.newrelic.agent.android:android-agent:3.+'

    compile 'uk.co.chrisjenx:calligraphy:0.7.+'

    compile 'com.github.chrisbanes.actionbarpulltorefresh:library:0.9.+'
    compile 'com.github.chrisbanes.actionbarpulltorefresh:extra-abc:0.9.+'

    apt "com.jakewharton:butterknife:${project.ext.butterKnifeVersion}"
    compile "com.jakewharton:butterknife:${project.ext.butterKnifeVersion}"

    compile fileTree(dir: 'libs', include: '*.jar')

    // Excluded modules were determined from here: https://github.com/robolectric/deckard-gradle
    instrumentTestCompile fileTree(dir: 'libs-test', include: '*.jar')
    instrumentTestCompile 'com.google.guava:guava:14.0.1',
            'com.squareup.dagger:dagger:1.1.0',
            'org.hamcrest:hamcrest-integration:1.1',
            'org.hamcrest:hamcrest-core:1.1',
            'org.hamcrest:hamcrest-library:1.1'

    instrumentTestCompile('junit:junit:4.11') {
        exclude module: 'hamcrest-core'
    }
    instrumentTestCompile('org.robolectric:robolectric:2.3-SNAPSHOT') {
        exclude module: 'classworlds'
        exclude module: 'maven-artifact'
        exclude module: 'maven-artifact-manager'
        exclude module: 'maven-error-diagnostics'
        exclude module: 'maven-model'
        exclude module: 'maven-plugin-registry'
        exclude module: 'maven-profile'
        exclude module: 'maven-project'
        exclude module: 'maven-settings'
        exclude module: 'nekohtml'
        exclude module: 'plexus-container-default'
        exclude module: 'plexus-interpolation'
        exclude module: 'plexus-utils'
        exclude module: 'wagon-file'
        exclude module: 'wagon-http-lightweight'
        exclude module: 'wagon-http-shared'
        exclude module: 'wagon-provider-api'
    }
    instrumentTestCompile 'org.mockito:mockito-core:1.9.+'

So my question is how can I make sure that the same support library is being used between the application APK and the test APK? I've already tried adding in instrumentTestCompile 'com.android.support:support-v4:+' to ensure the same support library version but that didn't help.

like image 404
plackemacher Avatar asked Apr 10 '14 18:04

plackemacher


1 Answers

After much pain, sweat and tears. I managed to determine the solution. Simply adding exclude group: 'com.android.support', module: 'support-v4' to the list of excludes for Robolectric allowed Robolectric to continue to work while having it not crash on the Dalvik runtime.

like image 105
plackemacher Avatar answered Oct 11 '22 19:10

plackemacher