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

Bra*_*bin 9 gradle kotlin

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

我想在我的测试中使用此功能,但我不想在我的生产代码中使用它(我希望我的类关闭).我怎样才能做到这一点?

我尝试过类似的东西:

test {
  allOpen {
    annotation('com.my.Annotation')
  }
}
Run Code Online (Sandbox Code Playgroud)

但代码总是执行.

Str*_*lok 13

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

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

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

  apply plugin: "kotlin-allopen"

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

}
Run Code Online (Sandbox Code Playgroud)

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

也许一些Gradle大师可以使用更好的解决方案.


p.a*_*xey 6

我想,你可以这样做:

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')
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在运行测试时,您不需要传递属性.