Android单元测试 - 没有这样的属性:bootClasspath

Woj*_*ski 19 android unit-testing gradle android-gradle-plugin

我正在尝试为刚刚宣布的单元测试支持执行简单的Android测试用例 - http://tools.android.com/tech-docs/unit-testing-support

在仔细跟随演练之后,我正试图运行./gradlew test.我收到这个错误:

Execution failed for task ':app:compileDebugGroovy'.
> No such property: bootClasspath for class: com.android.build.gradle.AppPlugin
Run Code Online (Sandbox Code Playgroud)

使用时com.android.tools.build:gradle:1.1.0-rc1.

还有其他人被困在那吗?

Woj*_*ski 12

问题是Groovy Android Gradle插件(让Groovy在Android上运行)不仅仅是在版本中使用Android插件1.1.0-rcX.

这是一段非常有趣的代码groovyx.grooid.GroovyAndroidPlugin,版本0.3.5(当前最新,这里是源代码)

    def getRuntimeJars(Project project, plugin) {
    int index
    switch (getAndroidPluginVersion(project)) {
        case ~/0\.9\..*/:
            index = 0
            break
        case ~/0\.10\..*/:
        case ~/0\.11\..*/:
        case ~/0\.12\..*/:
        case ~/0\.13\..*/:
        case ~/0\.14\..*/:
        case ~/1\.0\..*/:
            index = 1
            break
        default:
            index = RUNTIMEJARS_COMPAT.size()-1
    }
    def fun = RUNTIMEJARS_COMPAT[index]
    fun(plugin)
}
Run Code Online (Sandbox Code Playgroud)

和定义RUNTIMEJARS_COMPAT:

private static List RUNTIMEJARS_COMPAT = [
        { it.runtimeJars },
        { it.bootClasspath }
]
Run Code Online (Sandbox Code Playgroud)

这样API必须在Android的摇篮之间已经改变0.9.x0.10.0(是的,我知道-那些谷歌开发者改变了一切有:).那么让我们来看看在Android插件版本中制作类的问题1.0.0:

> javap -cp [path to proper jar] com.android.build.gradle.AppPlugin:

public class com.android.build.gradle.AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradle.api.Plugin<org.gradle.api.Project> {
...
public java.util.List super$2$getBootClasspath();
...
Run Code Online (Sandbox Code Playgroud)

对!我们需要的方法(来自父com.android.build.gradle.BasePlugin类).现在在版本中没有类似的东西1.1.0-rc3.更重要的是,API com.android.build.gradle.AppPlugin完全改变了,所以if(version)解决这个问题并不简单.

我想在1.1.0作者更新插件之前,没有机会让Groovy Android Gradle插件使用单元测试(从那时起).

我们等一下.