Kotlin有一个名为all open的编译器插件。它强制所有带注释的类都是开放的。
我想在我的测试中使用此功能,但我不想在我的生产代码中使用它(我希望我的课程关闭)。我怎么能这样做?
我尝试过类似的事情:
test {
allOpen {
annotation('com.my.Annotation')
}
}
但代码总是执行。
答案 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')
}
}
您可以尝试是否更适合您:)