安卓单元测试 - 没有 bootClasspath 属性

19

我正在尝试按照刚刚宣布的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

在使用com.android.tools.build:gradle:1.1.0-rc1时,有其他人也遇到了困难吗?


我使用最新的deckard-gradle进行检查时,更改gradle版本为com.android.tools.build:gradle:1.1.0-rc1后仍然遇到相同的错误。 - Erik B
1
这看起来是朝着正确方向迈出的一步,但我无法让JUnit运行配置识别单元测试。 - Erik B
3
你能否发布你的2个(模块和项目)build.gradle文件? - Simas
你可以在我的回答中找到更深入的调查。 - Wojtek Erbetowski
@sschuberth 真的 :-( 我错过了那个非常重要的部分!抱歉。 - Wojtek Erbetowski
显示剩余2条评论
3个回答

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)
}

以及RUNTIMEJARS_COMPAT的定义:

private static List RUNTIMEJARS_COMPAT = [
        { it.runtimeJars },
        { it.bootClasspath }
]

因此,在Android Gradle版本0.9.x0.10.0之间,API必须已经发生了变化(是的,我知道 - 那些Google开发人员总是在改变一切 :[)。因此,让我们来看看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();
...

嗯!我们需要的方法在父类com.android.build.gradle.BasePlugin中。但是在版本1.1.0-rc3中没有这样的方法。另外,com.android.build.gradle.AppPlugin的API完全改变了,所以简单的if(version)无法解决这个问题。 我猜在作者更新插件之前,Groovy Android Gradle插件不可能在单元测试中工作(自1.1.0以来)。 那么我们就等待吧。

你能否尝试使用0.3.6-SNAPSHOT并告诉我它是否可以直接运行?谢谢! - melix
在 https://jcenter.bintray.com/org/codehaus/groovy/gradle-groovy-android-plugin/0.3.6-SNAPSHOT/maven-metadata.xml 中未找到。我需要添加哪个仓库以获取快照版本? - Wojtek Erbetowski
谢谢。它通过编译并与1.1.0一起工作,但是没有支持编译Groovy测试类,因此目前仅适用于Java测试。这仍然是一个很大的改进! - Wojtek Erbetowski

1
那个测试支持功能是实验性的。也许没有快速解决方案来解决您的问题,或者可能存在错误。
然而,我会深入挖掘一下,阅读消息: 这一行 Execution failed for task ':app:compileDebugGroovy'. 提到了该任务,所以我会去找出这个任务是做什么的。我猜它是一个交付的任务。错误在于该任务中缺少一个属性 > No such property: bootClasspath for class: com.android.build.gradle.AppPlugin 因此,也许尝试找到该任务,并确保为 AppPlugin 类设置了 bootClasspath 属性。

1
谢谢你的提示,实际上它帮助我找到了原因。 - Wojtek Erbetowski

0
尝试升级到新版本(RC3)。
dependencies {
    classpath 'com.android.tools.build:gradle:1.1.0-rc3'
    // ..
}

您也可以在这里查看一个可工作的示例,以便与您当前的设置进行比较。


3
很遗憾,它没有起到帮助的作用。 - Wojtek Erbetowski

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