6

我最近开始使用 Android Studio 和 gradle 进行 android 开发,发现它总体上比 eclipse/ant 或 maven 好得多。然而,我最近开始尝试用我的应用程序实现某种单元和/或集成测试。我能够使用谷歌最近发布的 Espresso 框架进行基本测试。尽管我需要模拟和注入对象的模拟版本,但我进行了一些测试。我过去在另一个项目中使用过 dagger,所以我将 dagger 包含在我的项目中。但是,由于以下错误,现在我的测试将无法运行:

gradle connectedCheck

...

4.1.2 失败:仪器运行因“java.lang.IllegalAccessError”而失败:EspressoApp:connectedCheck

我在这里创建了一个简单的演示: https ://github.com/mwolfe38/android-espresso-dagger

只需克隆,然后从命令行运行: gradle connectedCheck

在上面我尝试了几种不同的依赖方式,最初是这样的:

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

但这给了我关于静态初始化的错误。这似乎是由 espresso 框架中有关 dagger 的一些静态初始化代码引起的。因此,在向 instrumentTestCompile 添加 dagger 依赖项后,我得到了上面提到的 IllegalAccessError。

任何人都有运气,包括在您的项目中使用匕首并进行浓缩咖啡测试?

4

2 回答 2

12

花了很长时间,但我终于让它工作了。我必须执行以下操作:

  1. 像这样声明我的依赖项:

    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. 从这里复制 hamcrest jar

  3. 像这样从 jar 中删除许可证文件(否则您会收到有关重复 LICENSE.txt 文件的错误)

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

需要注意的几件事:
- Hamcrest 1.3 对我不起作用,出现有关缺少匹配器的错误 - 疯狂我必须跳过多少圈才能到达这里。
- 祝你好运,让它与 android studio 一起玩得很好。

于 2013-10-29T07:42:44.303 回答
0

好的,所以我已经处理这个问题几个小时了,这是我的解决方法:把它放在你的 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.+'

在测试的 libs 文件夹中添加espresso 捆绑的 jar。现在是重要的部分。

使用 WinRar 或等效软件打开该 espresso 捆绑 jar,然后转到 com/ 文件夹,然后选择 de android 文件夹并删除它。现在关闭 WinRar 并编译并运行您的测试 :-)

于 2013-11-25T21:12:43.340 回答