如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?

Posted

技术标签:

【中文标题】如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?【英文标题】:How do I use the native JUnit 5 support in Gradle with the Kotlin DSL? 【发布时间】:2018-10-12 05:08:41 【问题描述】:

我想将内置 JUnit 5 与 Gradle Kotlin DSL 一起使用,因为在构建过程中我收到以下警告:

WARNING: The junit-platform-gradle-plugin is deprecated and will be discontinued in JUnit Platform 1.3.
Please use Gradle's native support for running tests on the JUnit Platform (requires Gradle 4.6 or higher):
https://junit.org/junit5/docs/current/user-guide/#running-tests-build-gradle

那个链接告诉我放

test 
    useJUnitPlatform()

在我的build.gradle 中,但是build.gradle.kts 的语法是什么?

我当前的构建文件是

import org.gradle.api.plugins.ExtensionAware

import org.junit.platform.gradle.plugin.FiltersExtension
import org.junit.platform.gradle.plugin.EnginesExtension
import org.junit.platform.gradle.plugin.JUnitPlatformExtension

group = "com.example"
version = "0.0"

// JUnit 5
buildscript 
    repositories 
        mavenCentral()
        jcenter()
    
    dependencies 
        classpath("org.junit.platform:junit-platform-gradle-plugin:1.2.0")
    


apply 
    plugin("org.junit.platform.gradle.plugin")


// Kotlin configuration.
plugins 

    val kotlinVersion = "1.2.41"

    application
    kotlin("jvm") version kotlinVersion
    java // Required by at least JUnit.

    // Plugin which checks for dependency updates with help/dependencyUpdates task.
    id("com.github.ben-manes.versions") version "0.17.0"

    // Plugin which can update Gradle dependencies, use help/useLatestVersions
    id("se.patrikerdes.use-latest-versions") version "0.2.1"



application 
    mainClassName = "com.example.HelloWorld"


dependencies 
    compile(kotlin("stdlib"))
    // To "prevent strange errors".
    compile(kotlin("reflect"))
    // Kotlin reflection.
    compile(kotlin("test"))
    compile(kotlin("test-junit"))

    // JUnit 5
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.2.0")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0")
    testRuntime("org.junit.platform:junit-platform-console:1.2.0")

    // Kotlintest
    testCompile("io.kotlintest:kotlintest-core:3.1.0-RC2")
    testCompile("io.kotlintest:kotlintest-assertions:3.1.0-RC2")
    testCompile("io.kotlintest:kotlintest-runner-junit5:3.1.0-RC2")



repositories 
    mavenCentral()
    mavenLocal()
    jcenter()

(以下是一些废话,因为这个问题“主要包含代码”)。 我试图找到有关如何在 Kotlin DSL 中自定义任务的文档,但我找不到任何文档。在普通的 Groovy 中,您可以只写任务的名称,然后更改块中的内容,但 Kotlin DSL 无法识别任务本身,未解析的引用。

此外,这个问题是相关的,但要求创建 任务,而不是自定义现有任务:How do I overwrite a task in gradle kotlin-dsl

Here is a solution for normal Gradle.

【问题讨论】:

【参考方案1】:

[2019 年 4 月编辑] 作为 Pedro has found,在我提出这个问题三个月后,Gradle 实际上为 Kotlin DSL 创建了一个用户指南,可以通过 https://docs.gradle.org/current/userguide/kotlin_dsl.html 访问该指南

他们还在https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/添加了从 Groovy 到 Kotlin 的迁移指南

答案:

你要求的语法是

tasks.test 
    // Use the built-in JUnit support of Gradle.
    useJUnitPlatform()

这是我从 Kotlin DSL GitHub 的 this example file 中找到的,或者您可以使用

tasks.withType<Test> 
    useJUnitPlatform()

在编写此答案几个月后创建的this official userguide 中使用(感谢Pedro's answer 注意到这一点)。

但无论如何,您实际上仍在使用 buildscript 块,它本身有点过时,请改用新的 plugins DSL (docs)。新的build.gradle.kts 变为

group = "com.example"
version = "0.0"

plugins 

    val kotlinVersion = "1.2.41"

    application
    kotlin("jvm") version kotlinVersion
    java // Required by at least JUnit.

    // Plugin which checks for dependency updates with help/dependencyUpdates task.
    id("com.github.ben-manes.versions") version "0.17.0"

    // Plugin which can update Gradle dependencies, use help/useLatestVersions
    id("se.patrikerdes.use-latest-versions") version "0.2.1"


application 
    mainClassName = "com.example.HelloWorld"


dependencies 
    compile(kotlin("stdlib"))
    // To "prevent strange errors".
    compile(kotlin("reflect"))
    // Kotlin reflection.
    compile(kotlin("test"))
    compile(kotlin("test-junit"))

    // JUnit 5
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.2.0")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0")
    testRuntime("org.junit.platform:junit-platform-console:1.2.0")

    // Kotlintest
    testCompile("io.kotlintest:kotlintest-core:3.1.0-RC2")
    testCompile("io.kotlintest:kotlintest-assertions:3.1.0-RC2")
    testCompile("io.kotlintest:kotlintest-runner-junit5:3.1.0-RC2")



repositories 
    mavenCentral()
    mavenLocal()
    jcenter()


tasks 
    // Use the native JUnit support of Gradle.
    "test"(Test::class) 
        useJUnitPlatform()
    

(由于 Gradle Kotlin DSL 除了一些(未记录的)示例文件on GitHub 之外几乎没有任何文档,我在这里记录了一些常见的示例。)

(GitHub 的完整示例项目,自我推销...)

【讨论】:

我只能说tasks "test"(Test::class) useJUnitPlatform() 而不是tasks test useJUnitPlatform() @EmanuelGeorgeHategan 谢谢,自从我写了之后,语法显然得到了改进,我更新了答案。【参考方案2】:

除了接受的答案之外,还可以使用类型化的任务配置,例如:

tasks.withType<Test> 
    useJUnitPlatform()

更新:

Gradle 文档供参考 here。特别是 Example 19 其中有:

tasks.withType<JavaCompile> 
    options.isWarnings = true
    // ...

【讨论】:

嘿,我试过了,你完全正确!即使多年后,Gradle 语言对我来说仍然很神奇。你可以在你找到这个的地方添加你的答案吗?我很好奇,因为在我写答案的时候,我在任何地方都找不到任何关于它的信息。 我从 Gradle 文档中推断出,我仍然在为 Gradle DSL 苦苦挣扎。 感谢您的链接!我很高兴看到他们正在添加文档,因为我问了这个问题(您链接到的文档是 2018 年 8 月,这个问题发生三个月后:))

以上是关于如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Gradle中使用JUnit 5?

如何使用 Gradle 和 JUnit 5 仅运行特定测试?

如何使用 Gradle 中的本地 JUnit Jar 而不是 Maven Central?

Gradle 5 JUnit BOM 和 Spring Boot 版本不正确

Gradle 没有找到我使用 Kotlin 和 JUnit 5 进行的测试

Kotlin 1.5.10,Gradle 7.0.2_2 - 找不到方法 testCompile() group=org.junit.jupiter,name=junit-jupiter-api,ve