如何在gradle构建测试时执行一些代码

时间:2017-08-19 18:56:42

标签: gradle kotlin

Kotlin有一个名为all open的编译器插件。它强制所有带注释的类都是开放的。

我想在我的测试中使用此功能,但我不想在我的生产代码中使用它(我希望我的课程关闭)。我怎么能这样做?

我尝试过类似的事情:

test {
  allOpen {
    annotation('com.my.Annotation')
  }
}

但代码总是执行。

3 个答案:

答案 0 :(得分:12)

这是因为插件应用于build.gradle文件的根目录。

100%工作的解决方案是不应用插件,除非设置了一些项目属性。

if (project.hasProperty("allopen")) {

  apply plugin: "kotlin-allopen"

  allOpen {
    annotation('com.my.Annotation')
  }

}

并使用属性gradle -Pallopen test运行测试。

也许有些Gradle专家可以使用更好的解决方案。

答案 1 :(得分:5)

我认为您可以这样做:

android.applicationVariants.all { ApplicationVariant variant ->
    boolean hasTest = gradle.startParameter.taskNames.find {it.contains("test") || it.contains("Test")} != null
    if (hasTest) {
        apply plugin: 'kotlin-allopen'
        allOpen {
            annotation('com.my.Annotation')
        }
    }
}

然后,您无需在运行测试时传递属性。

答案 2 :(得分:0)

我有一个完全相同的问题-由于嘲笑,只想为测试打开类。我不想使用自定义参数,因为代码是在CI上本地运行的,因此需要在任何地方进行设置。

为此找到了解决方案-检查任务名称是否包含test

def isTestTask = getGradle().getStartParameter().getTaskNames().any {name -> name.contains("test")}

if (isTestTask) {
    apply plugin: 'kotlin-allopen'
    allOpen {
        annotation('com.my.Annotation')
    }
}

您可以尝试是否更适合您:)