如何在我的Kotlin + Gradle项目中编译和运行我的JUnit测试?

Lau*_*ves 6 junit intellij-idea gradle kotlin

我按照上一个问题创建了一个Kotlin + Gradle项目.我添加了两个源文件:

SRC/HelloWorld.kt

package com.example.hello

fun main(args : Array<String>) { 
  println("Hello, world!") 
}
Run Code Online (Sandbox Code Playgroud)

测试/ HelloWorldTest.kt

package com.example.hello

import org.junit.Assert
import org.junit.Test

class HelloWorldTest {
    @Test
    fun testPasses() {
        Assert.assertTrue(true)
    }

    @Test
    fun testFails() {
        Assert.assertTrue(false)
    }
}
Run Code Online (Sandbox Code Playgroud)

我还将目录标记src/为源根目录和test/测试源根目录.

如果我在其他地方创建与这些源文件完全相同的目录结构并在其周围创建一个非Gradle IntelliJ项目,我能够编译并运行此代码,包括测试.

但是,在我的项目的Gradle版本中,我无法从IntelliJ IDEA构建测试.我收到以下错误:

Error:(3, 12) Kotlin: Unresolved reference: junit
Error:(4, 12) Kotlin: Unresolved reference: junit
Error:(7, 6) Kotlin: Unresolved reference: Test
Error:(9, 9) Kotlin: Unresolved reference: Assert
Error:(12, 6) Kotlin: Unresolved reference: Test
Error:(14, 9) Kotlin: Unresolved reference: Assert
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我运行gradle test(或./gradlew test在构建包装器之后)构建成功而没有错误,但测试不会运行.

  1. 如何以IntelliJ IDEA可以看到的方式添加JUnit?
  2. 如何让Gradle实际运行测试?
  3. 为什么IntelliJ IDEA和Gradle表现不同,如何在将来构建或运行测试时确保它们具有相同的行为?

hot*_*key 5

您需要将 JUnit 作为依赖项添加到您的build.gradle(根范围):

dependencies {
    //... 
    testCompile "junit:junit:4.12"
}
Run Code Online (Sandbox Code Playgroud)

它是一个比较复杂的Junit的5,它需要配置的JUnit插件摇篮build.gradle

  1. 由于 IntelliJ IDEA 解释您的 Gradle 项目并将其内部项目表示与 Gradle 项目同步,因此刷新后它将在测试类路径中看到 JUnit。

  2. 如果您运行test任务,Gradle 将运行测试,无论是通过gradlew test在终端中运行还是在 IntelliJ IDEA 中运行:Gradle 项目(右侧面板)任务验证测试

  3. 正如#1 中所说,IntelliJ IDEA 有自己的项目表示,它实际上可能与它从 Gradle 项目导入的不同(例如,如果您手动标记为与 Gradle 项目布局定义的目录不同的源目录)。

    您可以build.gradle通过运行刷新所有 Gradle 项目操作(可以在Gradle 项目面板中找到)使 IntelliJ IDEA 与您的项目结构同步,或者在设置中为您的 Gradle 项目启用使用自动导入

  • 谢谢!另一个缺失的难题是我没有在正确的地方找到我的来源。默认情况下,Gradle 显然希望它们位于 `src/main/kotlin` 和 `src/test/kotlin` 下。 (3认同)
  • 仅供参考,IntelliJ IDEA 有一个快捷方式`Ctrl+Shift+A` ["Navigating to Action"](https://www.jetbrains.com/help/idea/2016.2/navigating-to-action.html)。这就是@hotkey 在提到“刷新所有 Gradle 项目”操作时的意思 (2认同)