安卓 TDD : The saga continues with Robolectric & Gradle

标签 android tdd android-gradle-plugin robolectric

就在我使用 android-maven-plugin 实现有效的开发和构建环境时,新手 Gradle 开始进军 Android 圈子。在 Groovy 上并不热门,而且 android-gradle 插件几乎和操作系统本身一样支离 splinter ,我遇到了一些问题。特别是围绕构建图书馆项目,使用 flavor 和我们的伙伴 Robolectric

精简版

遇到 gradle 错误时,我不知道下一步该怎么做;

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

错误源于库中有 productFlavours(即移动到 0.9.2 android 构建系统)和 gradle-android-test-plugin 最近由Jake 创建的 Robolectric 团队(参见 here)。我已经进行了所有的调查,几乎筋疲力尽,可以报告说,我的库 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.

问题

应该如何设置/更改项目以促进 Robolectric 对具有 flavor 的库进行测试?这甚至可能吗?

最佳答案

我遇到了同样的问题,深入研究了代码,修复了它,并提交了一个刚刚合并的拉取请求。详情请看我在 PR 上的解释,归结为插件代码优化不好:

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

从今天开始,您需要克隆存储库并构建插件并将其安装到本地 Maven 存储库。下次他们向 Maven Central 发布版本时(可能是 0.13.1 版?),您将能够直接从那里使用该插件。

关于安卓 TDD : The saga continues with Robolectric & Gradle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23116409/

相关文章:

android - appwidget 从不去 onUpdate

android - In App billing Android : Item unavailable , 您请求的商品无法购买

ruby-on-rails - 在 Rails 3 中测试非功能性需求的最佳实践

ios - Swift 单例测试

android - 无法同步 Gradle 项目 "Application name"

android - 是否需要显式调用 system.loadLibrary 来访问 NativeActivity 子类中的 native 方法?

android - 可扩展 ListView 将组图标指示器向右移动

tdd - TDD 中的测试装置(测试驱动开发)

android - "multiDexEnabled true"是什么意思?

java - 错误 :Execution failed for task ':app:dexDebug' . .. 使用 android studio