【问题标题】:Android Unit Tests - no such property: bootClasspathAndroid 单元测试 - 没有这样的属性:bootClasspath
【发布时间】:2015-04-10 15:10:29
【问题描述】:

在刚刚宣布的单元测试支持之后,我正在尝试为 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时遇到了同样的错误
  • This 看起来是朝着正确方向迈出的一步,但我无法让 JUnit 运行配置识别单元测试。
  • 忘记了我的构建变体,现在它在上面链接的克隆项目中工作。仍在尝试融入我的项目。
  • 你能发布你的 2 个(模块和项目)build.gradle 文件吗?
  • 您可以在我自己的回答中找到进一步的调查。

标签: android unit-testing gradle android-gradle-plugin


【解决方案1】:

问题在于 Groovy Android Gradle 插件(让 Groovy 在 Android 上运行)不能简单地与版本 1.1.0-rcX 的 Android 插件一起使用。

这是一段非常有趣的代码,直接来自groovyx.grooid.GroovyAndroidPlugin,版本0.3.5(当前最新,这里是source

    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 中的 API 必须在 0.9.x0.10.0 之间发生变化(是的,我知道 - 那些 Google 开发人员改变了那里的一切:[)。那么我们来看看Android Plugin版本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 并告诉我它是否可以开箱即用?谢谢!
  • jcenter.bintray.com/org/codehaus/groovy/… 中找不到。我需要为快照添加哪个存储库?
  • 谢谢。它通过了编译并与 1.1.0 一起工作,但不支持编译 Groovy 测试类,因此目前只有 Java 测试工作。这仍然是一个很大的进步!
【解决方案2】:

测试支持功能是实验性的。也就是说,您的问题可能没有快速解决方案,或者可能是一个错误。

但是,我会更深入地研究这一点,阅读以下消息: Execution failed for task ':app:compileDebugGroovy'. 这一行提到了任务,所以我会去弄清楚该任务的作用。我想这是一个交付的任务。错误在于该任务中缺少一个属性&gt; No such property: bootClasspath for class: com.android.build.gradle.AppPlugin

所以也许尝试找到该任务并确保为 AppPlugin 类设置了 bootClasspath 属性。

【讨论】:

  • 感谢您的提示,实际上它帮助我找到了原因
【解决方案3】:

尝试升级到新版本(RC3

dependencies {
    classpath 'com.android.tools.build:gradle:1.1.0-rc3'
    // ..
}

您也可以在此处发送look,以便将您当前的设置与工作示例进行比较。

【讨论】:

  • 不幸的是它没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多