就在我使用 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/