【问题标题】:Gradle: kotlin tests can't see java files in testGradle:kotlin测试在测试中看不到java文件
【发布时间】:2019-05-27 12:24:38
【问题描述】:

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

.
├── build.gradle
├── gradle
│   └── wrapper...
│       
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── kotlin
    │   │   └─ ...
    │   └── resources
    │       └── application.yml
    └── test
        └── kotlin
            └────── xxx
                    └── shop
                        └── order
                            ├── Junit5Kotlin.kt
                            ├── Junit5Test.java
                            ├── OrderITest.kt
                            ├── ProductITest.kt
                            └── Util.java

来自 intellij(“运行所有测试”单击“测试”目录)一切正常。来自./gradlew test test kotlin classes don't see java test util classes:

xxx.shop.order.Manual > should return client error on bad input FAILED
    java.lang.NoClassDefFoundError: xxx/shop/order/Util
        at xxx.shop.order.Manual.before(ProductITest.kt:229)

        Caused by:
        java.lang.ClassNotFoundException: xxx.shop.order.Util
            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
            ... 1 more

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

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

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'kotlin-jpa'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'xxx.shop'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
compileKotlin {
    kotlinOptions {
        freeCompilerArgs = ["-Xjsr305=strict"]
        jvmTarget = "1.8"
    }
}
compileTestKotlin {
    kotlinOptions {
        freeCompilerArgs = ["-Xjsr305=strict"]
        jvmTarget = "1.8"
    }
}

test {
    useJUnitPlatform()
}

【问题讨论】:

    标签: java gradle kotlin junit5


    【解决方案1】:

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

    └── src
        ├── main
        │   ├── kotlin
        │   │   └─ ...
        │   ├── java
        │   │   └─ ...
        │   └── resources
        │       └── application.yml
       └── test
            └── kotlin
                └────── xxx
                        └── shop
                            └── order
                                ├── Junit5Kotlin.kt
                                ├── OrderITest.kt
                                ├── ProductITest.kt
                                └── Util.java
                java
                └────── xxx
                        └── shop
                            └── order
                                ├── Junit5Test.java
    

    并将java插件添加到gradle

    apply plugin: 'java'
    

    编辑: 好的,如果您希望所有内容都在 kotlin 目录中,请尝试将其添加到您的 build.gradle:

    apply plugin: 'java'
    sourceSets.main.java.srcDirs = ['src/main/kotlin']
    sourceSets.test.java.srcDirs = ['src/test/kotlin']
    

    这样它将在 kotlin one 之前运行 java 编译器,因此您将拥有这个 .class 文件。

    【讨论】:

    • 这就是我想要避免的。我想按功能而不是技术来分离我的代码
    • @piotrek 在一个模块中混合两种技术可能是根本问题。当Util.java 被转换为Util.kt 时,它通常不会那么复杂。当两种技术都依赖它时,考虑将其放入库模块中(然后可以独立测试)。
    • @MartinZeitler 是的,除非它是一个包含数千个 java 类的现有项目或 kotlin 无法与 spring 合作的部分,例如stackoverflow.com/a/53908207/1100135
    • @piotrek 将没有适当的 Kotlin 互操作性的 Java 代码移动到它自己的模块中仍然会使其更容易处理......甚至在转换停滞的地方提供更好的概述。跨度>
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多