双浓咖啡不与Robolectric合作

我尝试通过Robolectric的仪器testing和unit testing来运行Espresso(使用Double Espresso )。 到目前为止,我所做的大部分工作都是基于甲板式的例子。

注意: Gradle 1.10

buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.10.4' classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.0' } } apply plugin: 'android' apply plugin: 'android-test' android { compileSdkVersion 19 buildToolsVersion '19.0.3' defaultConfig { packageName = 'com.example.app' minSdkVersion 9 targetSdkVersion 19 versionCode 1 versionName '1.0.0' testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } buildTypes { debug { debuggable = true runProguard = false } release { debuggable = false runProguard = true } } sourceSets { androidTest { setRoot('src/test') } } packagingOptions { exclude 'LICENSE.txt' } } androidTest { include '**/*Test.class' exclude '**/espresso/**/*.class' maxHeapSize = "2048m" } repositories { mavenCentral() } dependencies { compile 'com.android.support:support-v4:19.1.0' androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') androidTestCompile('com.jakewharton.espresso:espresso-support-v4:1.1-r3') { exclude group: 'com.android.support', module: 'support-v4' } androidTestCompile('junit:junit:4.11') { exclude module: 'hamcrest-core' } androidTestCompile('org.robolectric:robolectric:2.3') { 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' } androidTestCompile 'com.squareup:fest-android:1.0.8' } 

我的目录结构如下,其中com.example.app.espresso需要以connectedAndroidTestcom.example.app.data作为test

 SRC
 |  - debugging
 |  - 主要
 |  - 发布
 |  - testing
    |  -  java
       |  -  com
          |  - 示例
             |  - 应用程序
                |  - 意式咖啡
                   |  -  HomeActivityTest.java
                |  - 数据
                   |  -  DataTest.java
    |  - 资源
       |  -  data_input.json

所以当我运行gradle clean test ,我得到的错误不能识别HomeActivityTest.java Espresso导入。

当我运行gradle clean connectedAndroidTest ,我得到的错误不能识别DataTest.java中的JUnit4注释( FailedToCreateTests.testSuiteConstructionFailed )。

如果我拿出任何一个部分(依赖和来源),另一个独立工作,但不包括在一起的所有东西。

注意:我尝试在本地导入Espresso jar(没有Double Espresso),同样的方法是使用deckard-gradle,直到我在Espressotesting中使用support-v4库中的任何东西( com.jakewharton.espresso:espresso-support-v4似乎解决了这个问题,这是没有替代本地jar),然后爆炸到FailedToCreateTests.testSuiteConstructionFailed

有没有人有这个结构工作? 有没有办法从每个目标排除源path?

任何解决scheme(全部或部分)将不胜感激。

Solutions Collecting From Web of "双浓咖啡不与Robolectric合作"

发生这种情况是因为Double Espresso工件是作为.aar文件分发的,而Robolectric为运行testing而生成的编译任务并不依赖于解包作为androidTestCompile依赖项configuration一部分的.aar文件的任务。

由于通常不会将运行espressotesting作为运行unit testing任务的一部分,因此可以安全地排除由Robolectric插件生成的编译任务中的espressotesting。 我这样做是通过向由我的build.gradle触发源属性的Robolectric插件生成的编译任务添加一个依赖项。 下面的示例代码。 请确保在必要时修改robolectric生成的编译任务的名称(在我的示例中为“compileTestDebugJava”)和“排除”espressotesting。

 tasks.whenTaskAdded { theTask -> if ("compileTestDebugJava".toString().equals(theTask.name.toString())) { def cleanupTask = "touchUpRobolectricSourceSet" project.task(cleanupTask) << { FileTree tree = fileTree(dir: 'src/test/java') tree.exclude '**/espresso/**/*.java' theTask.source = tree } theTask.dependsOn(cleanupTask) } } 

最后,我放弃了使用Double Espresso的想法,并采用甲板式Gradle所采用的方法 – 手动导入Espresso jar( espressotestrunnertestrunner-runtime )。

看来,无论是双浓咖啡不仅仅是把jar子包装起来,而是把它们装进jar子里,或者说它们是jar子的问题。 有兴趣知道为什么。

为了避免保留本地依赖,我将Espresso jar上传到Maven repo,并将它们菊花链( espresso依赖于testrunner-runtimetestrunner-runner依赖于testrunner ),并包含所有第三方依赖项(Guava,Hamcrest,Dagger等)在POM中。 如果您没有托pipe的Maven回购,可以使用GitHub作为回购: https : //stackoverflow.com/a/14013645/818393 。

诚然,不是最好的解决scheme,但它的工作原理。

我有同样的问题,似乎是匕首1.2(包括作为Jake的双浓咖啡依赖)的错。 如果你包含普通的1.1库,它应该工作。

(完整的线程在这里: https : //groups.google.com/forum/#!topic/robolectric/xeLrnCAsq5Q )