Android TDD:采用Robolectric和Gradle继续冒险

3

当我使用了android-maven-plugin搭建有效的开发和构建环境时,全新的Gradle开始在Android领域崭露头角。由于不熟悉Groovy语言,且android-gradle插件几乎和OS本身一样分散,我遇到了一些问题,尤其是在构建带有flavours和我们的伙伴Robolectric的库项目方面。

简短版本

当我遇到gradle错误时,我很困惑下一步该怎么做。

Cannot add a SourceSet with name 'testDebug' as a SourceSet with that name already exists.

错误来自于在库中使用了productFlavours(即迁移到0.9.2 Android构建系统),而最近由Robolectric团队从Jake的创建中分叉出的gradle-android-test-plugin(请参见此处)。我已经跟踪了所有线索,几乎耗尽了所有力气,并报告说,在我的库gradle文件中存在'android-test'插件会使事情变得错综复杂。

更详细的版本

这是缩略的应用程序build.gradle文件,保留了相关信息;
apply plugin: 'android-library'
apply plugin: 'android-test'
...
android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 18
        targetSdkVersion 19
        versionCode buildNumber().toInteger()
        versionName "1.0.0"
    }

    productFlavors {
        estimote {
            dependencies {
                compile '<flavour specific dependency>'
            }
        }

        radius {
            dependencies {
                compile '<flavour specific dependency>'
            }
        }
    }
}
...
dependencies {
    compile 'com.squareup.dagger:dagger:1.2.1'
    compile 'com.squareup.dagger:dagger-compiler:1.2.1'
    compile 'com.google.code.gson:gson:2.2.+'

    // Testing dependencies
    androidTestCompile 'org.mockito:mockito-core:1.9.5'
    androidTestCompile 'com.squareup:fest-android:1.0.7'
    androidTestCompile 'org.hamcrest:hamcrest-all:1.3'
    androidTestCompile 'org.robolectric:robolectric:2.2'
    androidTestCompile 'junit:junit:4.11'
}

这里是简化的根 build.gradle 文件。

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.2'
        classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.9.+'
    }
}

allprojects {
    repositories {
        mavenLocal()
        mavenCentral()
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
    }
}

如果您已经看到了页面底部,请给自己一个鼓励。现在,你们中的一些细心的人可能已经注意到了sourceSets重定向命令的遗漏问题。
sourceSets {
        androidTest {
            setRoot('src/test')
        }
    }

在纠正了最初的错误之后,这些代码行需要重新启用,以通知Gradle项目的结构。该项目的结构是标准的,看起来像这样;
- project_name
  + gradle
  - lib
     + flavour1
     + flavour2
     - main
        + java
     - test
        + java
    build.gradle
 build.gradle
 gradle.properties
 settings.gradle

使用了哪些工具

该应用程序使用 gradle-1.10-all,0.9.2 android-gradle 插件和 0.9.+ gradle-android-test-plugin

问题

如何设置/更改项目以便在带有 Flavor 的库上实现 Robolectric 测试?这是否已经可行了?


我也遇到了同样的问题,如果你已经解决了这个谜团,我希望能得到解决方案的更新。谢谢。 - Kevin
这个特定问题目前没有解决方案,@Kevin,但是使用最新的Android Studio和Robolectric Beta版本似乎一切正常。如果可以的话,请更新... - BrantApps
1个回答

2
我遇到了相同的问题,深入研究了代码并进行了修复,然后提交了一个拉取请求,现在已经合并了。有关详细信息,请查看我的PR上的说明,但归根结底,问题出在插件代码中的一个糟糕的优化上。

https://github.com/robolectric/robolectric-gradle-plugin/pull/70

从今天起,您需要克隆存储库并构建和安装插件到本地的Maven仓库。下一次他们发布到Maven中央(也许是0.13.1版本?),您就可以直接从那里使用该插件了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接