【问题标题】:How to execute some code when gradle is building the testsgradle构建测试时如何执行一些代码
【发布时间】:2017-08-19 18:56:41
【问题描述】:

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

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

我尝试了类似的方法:

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

但代码总是执行。

【问题讨论】:

  • 但是只要这个注解只用于你的测试类,这不是问题,对吧?无论如何,我很感兴趣你为什么需要它来进行测试?
  • 注解用于允许 Mockito 模拟我的生产代码,所以注解在我的生产代码中 :(。为什么我需要这个?因为有 some other ways 来模拟封闭类但是 @ 987654323@.

标签: gradle kotlin


【解决方案1】:

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

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

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

  apply plugin: "kotlin-allopen"

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

}

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

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

【讨论】:

  • 这是一个很好的解决方案。 :+1: 另一个可能是扭转这种情况。默认情况下它将始终处于打开状态,并且在您的发布脚本中,您可以将 CLI 参数设置为禁用,使其再次成为最终版本。
  • 我很好奇如何在 Android Studio 配置中添加属性。
【解决方案2】:

我认为,你可以这样做:

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

那么你在运行测试时就不需要传递属性了。

【讨论】:

  • 您不需要ApplicationVariant,否则我认为这是最好的解决方案。谢谢!
  • 我为 IDE 添加了ApplicationvVariant 以提示变体的所有属性。不客气!
【解决方案3】:

我遇到了完全相同的问题 - 因为嘲笑,我只想为测试开设课程。我不想使用自定义参数,因为代码在本地运行,在 CI 上,因此需要到处设置。

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

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

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

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

【讨论】:

  • 任何具体的为什么它不起作用?注释是否设置正确?
  • 也许是语法。我尝试使用 p.alexey 的答案中的语法,它起作用了:)
猜你喜欢
  • 2018-05-09
  • 2020-06-21
  • 2014-02-14
  • 2022-07-06
  • 1970-01-01
  • 2012-08-11
  • 2014-04-08
  • 2016-02-18
  • 1970-01-01
相关资源
最近更新 更多