6

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.

Community
  • 1
  • 1
plackemacher
  • 4,216
  • 1
  • 23
  • 26

1 Answers1

7

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.

plackemacher
  • 4,216
  • 1
  • 23
  • 26
  • 2
    Just to let other know - this also solved my issue when a simple test wouldn't start after adding `appcompat` library. `java.lang.RuntimeException: Exception during suite construction at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238)` – imbryk Jun 03 '14 at 10:06
  • 2
    androidTestCompile('org.robolectric:robolectric:2.3+') { exclude group: 'com.android.support', module: 'support-v4' } androidTestCompile ('com.squareup:fest-android:1.0.+'){ exclude group: 'com.android.support', module: 'support-v4' } 2 days of tears... Thank you guys!!! – velkopopovizky Jun 17 '14 at 10:16