如何在使用Gradle和IntelliJ的Kotlin多平台项目中配置JUnit 5?

6

JUnit 4(工作中)

在IntelliJ IDEA 2018.2.3(社区版)中,Kotlin多平台模板依赖于build.gradle中的JUnit 4.12来处理项目的JVM部分:

plugins {
    id 'kotlin-platform-jvm' version '1.2.61'
}
repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    expectedBy project(":TestMulti-common")
    testCompile "junit:junit:4.12"
    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
sourceCompatibility = "1.8"

使用这个模板,我可以将测试添加到项目的公共部分,并且 IntelliJ 可以识别这些测试:源文件的边距处会出现“运行”图标,并且可以通过上下文菜单运行测试。
JUnit 5(在 IntelliJ 中无法正确识别测试)
如何使用 JUnit 5 实现类似的设置?
值得注意的是,我正在使用 Gradle 4.10(一些旧的示例使用已自 Gradle 4.6 起被弃用的 junit-platform-gradle-plugin)。有关如何设置此项的文档已过时且稀缺:
- 如上所示,IntelliJ 中构建的默认项目模板不使用 JUnit 5。 - JUnit 团队提供了示例,但不适用于 Kotlin 多平台。
当我尝试为基于JUnit 5 Gradle示例的项目的JVM部分设置build.gradle时,我可以使用Gradle运行测试,但IntelliJ似乎无法识别我的测试。请注意保留html标签。
plugins {
    id 'kotlin-platform-jvm' version '1.2.61'
}
repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    expectedBy project(":TestMulti-common")

    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit5"

    testCompile('org.junit.jupiter:junit-jupiter-api:5.3.1')
    testCompile('org.junit.jupiter:junit-jupiter-params:5.3.1')
    testRuntime('org.junit.jupiter:junit-jupiter-engine:5.3.1')
}

test {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
sourceCompatibility = "1.8"

有趣的是,有时候在JVM项目上运行gradle test时,测试结果会出现在IntelliJ的测试结果中,但当重新运行测试时,会显示消息"未收到测试事件"。源文件中的“运行”图标和上下文菜单中的测试选项都没有出现。
其他人似乎也遇到了类似的问题,但目前尚不清楚这些问题是否相同/相关或已解决:

许多不同版本的发布、过时的文档以及类似的问题使得难以找到更多关于此问题的信息。


@Roland,最初我也使用了testImplementation(因为我认为这是新的编写方式)。但由于JUnit示例列出了testCompile(另一个过时文档的例子),所以我只使用了testCompile。但两者都不起作用。你是否也有一个多平台项目? - Steven Jeuris
啊...算了...哦亲爱的...我看错了,应该是多模块... :-( 又要再次删除我的评论了 ;-) - Roland
1
关于重新运行测试“不起作用”的问题,请参考此处的“设计说明”(https://github.com/JetBrains/gradle-intellij-plugin/issues/33)。这是因为任务已经是最新状态,没有进行任何更改。如果想要在IntelliJ中始终看到测试结果,请先通过运行`gradle cleanTest test`来清除测试。 - Steven Jeuris
1
我还在相关的JetBrains YouTrack工单中@了某人。我将先等待回复/今晚睡一觉,明天可能会在JetBrains开启一个新的bug问题,将我们所学到的内容压缩成一个单独的bug报告。至少在我的端上,我现在可以使用org.jetbrains.kotlin:kotlin-test-junit5来创建一个简单的重现。我检查了这个和org.jetbrains.kotlin:kotlin-test-junit之间的源代码差异,但不知道这如何影响IntelliJ的测试查找。 - Steven Jeuris
1
在JetBrain的YouTrack上发布了此内容作为错误报告 - Steven Jeuris
显示剩余7条评论
2个回答

2

1
在我的情况下,IntelliJ IDEA 升级后禁用了 JUnit 插件,因此我需要重新启用它(需要重启 IDE):

IntelliJ IDEA JUNit plugin needs to be enabled


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接