如何使用Kotlin DSL在Gradle中使用本机JUnit 5支持?

时间:2018-05-02 06:54:38

标签: gradle kotlin gradle-kotlin-dsl

我想将内置的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()
}

(以下是一些blabla,因为这个问题'主要包含代码')。 我试图找到关于如何在Kotlin DSL中自定义任务的文档,但我找不到任何文档。在正常的Groovy中,您只需编写任务的名称,然后更改块中的内容,但Kotlin DSL无法识别任务,即未解析的参考。

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

Here is a solution for normal Gradle.

2 个答案:

答案 0 :(得分:5)

[编辑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 {
    // Use the built-in JUnit support of Gradle.
    "test"(Test::class) {
        useJUnitPlatform()
    }
}

我从Kotlin DSL GitHub的this example file中找到了。

但是在任何情况下你实际上仍在使用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()
    }
}

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

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

答案 1 :(得分:3)

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

tasks.withType<Test> {
    useJUnitPlatform()
}

更新

供参考here使用的分级文档。具体来说,示例19 具有:

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