Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle:kotlin测试可以';在测试中看不到java文件_Java_Gradle_Kotlin_Junit5 - Fatal编程技术网

Gradle:kotlin测试可以';在测试中看不到java文件

Gradle:kotlin测试可以';在测试中看不到java文件,java,gradle,kotlin,junit5,Java,Gradle,Kotlin,Junit5,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 │   │   └─ ... │ 

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类看不到java测试util类:

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
这不是编译时错误,而是运行时错误,因为其他测试成功完成

my 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()
}
apply plugin: 'java'
sourceSets.main.java.srcDirs = ['src/main/kotlin']
sourceSets.test.java.srcDirs = ['src/test/kotlin']

您必须将java文件放在
java
dir中,否则它们将不会被编译

└── 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: '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()
}
apply plugin: 'java'
sourceSets.main.java.srcDirs = ['src/main/kotlin']
sourceSets.test.java.srcDirs = ['src/test/kotlin']

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

这就是我试图避免的。我想按功能而不是按technology@piotrek在一个模块中混合使用两种技术可能是问题的根源。当
Util.java
转换为
Util.kt
时,一般来说就不那么复杂了。当两种技术都依赖它时,考虑将其放入一个库模块(然后可以独立测试)。除非它是一个现有的项目,包含数千个java类或kotlin无法与spring一样的@piotrek合作的部分,如果没有适当的
kotlin
互操作性,将
java
代码移动到它自己的模块中,仍然会更容易处理。。。甚至提供更好的概述,在转换停滞的地方。