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

gradle构建测试时如何执行一些代码,gradle,kotlin,Gradle,Kotlin,Kotlin有一个名为的编译器插件。它强制所有带有一些注释的类都是打开的 我想在我的测试中使用这个特性,但我不想在我的生产代码中使用它(我想关闭我的类)。我该怎么做 我试过这样的方法: test { allOpen { annotation('com.my.Annotation') } } 但是代码总是被执行。之所以发生这种情况,是因为插件应用于build.gradle文件的根目录中 一个100%有效的解决方案是,除非设置了某些项目属性,否则不要应用插件 if (project

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

我想在我的测试中使用这个特性,但我不想在我的生产代码中使用它(我想关闭我的类)。我该怎么做

我试过这样的方法:

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

但是代码总是被执行。

之所以发生这种情况,是因为插件应用于
build.gradle
文件的根目录中

一个100%有效的解决方案是,除非设置了某些项目属性,否则不要应用插件

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

  apply plugin: "kotlin-allopen"

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

}
并使用以下属性运行测试:
gradle-pallopentest


也许一些Gradle大师可以提出一个更好的解决方案。

我也有同样的问题——因为模仿,我只想为测试打开类。我不想使用自定义参数,因为代码在CI上本地运行,因此需要到处设置

找到解决方案-检查任务名称是否包含
测试

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

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

如果它更适合你,你可以试试:)

我想,你可以这样做:

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

这样,在运行测试时就不需要传递属性。

但只要此注释仅用于测试类,这就不是问题,对吗?无论如何,我很感兴趣的是,为什么测试需要它?注释用于允许Mockito模拟我的生产代码,因此注释在我的生产代码中:(.为什么我需要这个?因为有模拟关闭的类,但是。这是一个很好的解决方案。:+1:另一个可能是扭转这种情况。默认情况下,它将始终打开,在发布脚本中,您可以将CLI参数设置为禁用,使它们再次成为最终值。我很好奇如何在Android Studio配置中添加属性。有任何特定的设置吗为什么不起作用?你是否正确设置了注释?可能是语法问题。我试着使用p.alexey答案中的语法,结果成功了:)您不需要
ApplicationVariant
,但我发现这是最好的解决方案。谢谢!我为IDE添加了
ApplicationvVariant
,以提示variant的所有属性。欢迎您!