Using android gradle + dagger to run instrumentTes

2019-03-16 09:57发布

问题:

I have began using Android Studio and gradle recently for android development and find it much better overall than eclipse/ant or maven. However I've recently began trying to implement some kind of unit and or integration tests with my app. I was able to get basic tests working using the Espresso framework recently released by google. I had some tests though where I needed to mock and inject mocked versions of objects. I used dagger in the past for another project so I included dagger into my project. However now my tests won't run because of the following error:

gradle connectedCheck

...

4.1.2 failed: Instrumentation run failed due to 'java.lang.IllegalAccessError' :EspressoApp:connectedCheck

I created a simple demo of this here: https://github.com/mwolfe38/android-espresso-dagger

Just clone and then from command line run: gradle connectedCheck

In the above I have tried the dependencies several different ways, originally like this:

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.squareup.dagger:dagger-compiler:1.1.0'
    compile 'com.squareup.dagger:dagger:1.1.0'

    instrumentTestCompile files('libs/espresso-1.0-SNAPSHOT.jar',
            'libs/testrunner-1.0-SNAPSHOT.jar',
            'libs/testrunner-runtime-1.0-SNAPSHOT.jar')
    instrumentTestCompile 'org.hamcrest:hamcrest-all:1.3'
    instrumentTestCompile 'com.google.guava:guava:15.0'
}

but that gives me an error regarding static initialization. This appears to be caused by some static initialization code in the espresso framework regarding dagger. So After adding dagger dependencies to instrumentTestCompile I get the IllegalAccessError mentioned above.

Anyone have luck including dagger in your project and doing espresso tests?

回答1:

Took quite awhile but I finally got it working. I had to do the following:

  1. Declare my dependencies like so:

    dependencies {
      compile 'com.android.support:appcompat-v7:+'
      compile 'com.squareup.dagger:dagger-compiler:1.1.0'
      compile 'com.squareup.dagger:dagger:1.1.0'
    
      instrumentTestCompile files('libs/espresso-1.0-SNAPSHOT.jar','libs/testrunner-1.0-SNAPSHOT.jar','libs/testrunner-runtime-1.0-SNAPSHOT.jar')
      instrumentTestCompile files('libs/hamcrest-core-1.1.jar', 'libs/hamcrest-library-1.1.jar', 'libs/hamcrest-integration-1.1.jar')
      instrumentTestCompile 'com.google.guava:guava:14.0.1'
    }
    
  2. Copy the hamcrest jars from here

  3. Remove the license files from the jars like this (or else you'll get an error about duplicate LICENSE.txt files)

    zip -d hamcrest-core-1.1.jar LICENSE.txt
    zip -d hamcrest-library-1.1.jar LICENSE.txt
    
  4. Run gradle connectedCheck

A few things to note:
- Hamcrest 1.3 didn't work for me, got an error about a matcher was missing - Crazy how many hoops I had to jump through to get here.
- Good luck getting this to play well with android studio.



回答2:

Ok, so I have been dealing with this problem for hours, and here is my fix: Put this in the dependencies of your build.gradle

compile(project(':commons:statemachine')) {
    exclude module: 'junit'
    exclude module: 'json'
    exclude module: 'guava'
}

compile 'com.google.guava:guava:15.0'
instrumentTestCompile files('libs/espresso-1.0-SNAPSHOT-bundled.jar')
instrumentTestCompile 'com.squareup:fest-android:1.0.+'

Add the espresso bundled jar in the libs folder of your test. Now comes the important part.

Open that espresso bundled jar with WinRar or equivalent and go to com/ folder, then select de android folder and Delete it. Now close WinRar and compile and run your test :-)