Gradle:kotlin 测试在测试中看不到 java 文件

pio*_*rek 5 java gradle kotlin junit5

java 8, gradle 5, kotlin 1.2.71, junit 5.3.2, intellij 2018.03 12 月 17 日,将 kotlin 和 java 文件保存在同一 src 目录中\n文件结构为:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.gradle\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradle\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wrapper...\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradlew\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gradlew.bat\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kotlin\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80 ...\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 resources\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application.yml\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kotlin\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 xxx\n                    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 shop\n                        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 order\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Junit5Kotlin.kt\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Junit5Test.java\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 OrderITest.kt\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ProductITest.kt\n                            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Util.java\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自intellij(“运行所有测试”点击“测试”目录)一切正常。从./gradlew test测试 kotlin 类看不到 java 测试 util 类:

\n\n
xxx.shop.order.Manual > should return client error on bad input FAILED\n    java.lang.NoClassDefFoundError: xxx/shop/order/Util\n        at xxx.shop.order.Manual.before(ProductITest.kt:229)\n\n        Caused by:\n        java.lang.ClassNotFoundException: xxx.shop.order.Util\n            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)\n            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)\n            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)\n            ... 1 more\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不是编译时错误,而是运行时错误,因为其他测试已成功完成

\n\n

我的 build.gradle 的潜在重要部分:

\n\n
apply plugin: \'kotlin\'\napply plugin: \'kotlin-spring\'\napply plugin: \'kotlin-jpa\'\napply plugin: \'eclipse\'\napply plugin: \'org.springframework.boot\'\napply plugin: \'io.spring.dependency-management\'\n\ngroup = \'xxx.shop\'\nversion = \'0.0.1-SNAPSHOT\'\nsourceCompatibility = 1.8\ncompileKotlin {\n    kotlinOptions {\n        freeCompilerArgs = ["-Xjsr305=strict"]\n        jvmTarget = "1.8"\n    }\n}\ncompileTestKotlin {\n    kotlinOptions {\n        freeCompilerArgs = ["-Xjsr305=strict"]\n        jvmTarget = "1.8"\n    }\n}\n\ntest {\n    useJUnitPlatform()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Kon*_*bun 3

你必须将你的java文件放在javadir中,否则它们将不会被编译。

\n\n
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kotlin\n    \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80 ...\n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 java\n    \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80 ...\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 resources\n    \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application.yml\n   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kotlin\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 xxx\n                    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 shop\n                        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 order\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Junit5Kotlin.kt\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 OrderITest.kt\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ProductITest.kt\n                            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Util.java\n            java\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 xxx\n                    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 shop\n                        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 order\n                            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Junit5Test.java\n
Run Code Online (Sandbox Code Playgroud)\n\n

并在gradle中添加java插件

\n\n
apply plugin: 'java'\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑: \n好的,如果您希望将其全部放在 kotlin 目录中,请尝试将其添加到您的 build.gradle 中:

\n\n
apply plugin: 'java'\nsourceSets.main.java.srcDirs = ['src/main/kotlin']\nsourceSets.test.java.srcDirs = ['src/test/kotlin']\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样它会在 kotlin 编译器之前运行 java 编译器,所以你会得到这个.class文件。

\n