我怎样才能让我的JUnit测试在我的Kotlin + Gradle项目中编译和运行?

根据上一个问题,我创建了一个Kotlin + Gradle项目。 我添加了两个源文件:

SRC / HelloWorld.kt

package com.example.hello fun main(args : Array<String>) { println("Hello, world!") } 

测试/ 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) } } 

我还将src/目录标记为源根目录,并将其作为测试源根目录。

如果我在其他地方创建与这些源文件完全相同的目录结构,并创建一个非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 

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

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

您需要将JUnit作为依赖添加到您的build.gradle (根作用域)中:

 dependencies { //... testCompile "junit:junit:4.12" } 

对于Junit 5来说更复杂一些,它需要在build.gradle 配置JUnit Gradle插件

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

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

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

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