Java 未找到单独文件夹库中的IntelliJ集成测试:Springboot与Gradle项目配置问题
我有一个intelliJ Springboot Gradle项目,其结构如下:Java 未找到单独文件夹库中的IntelliJ集成测试:Springboot与Gradle项目配置问题,java,spring-boot,gradle,intellij-idea,Java,Spring Boot,Gradle,Intellij Idea,我有一个intelliJ Springboot Gradle项目,其结构如下: MyProject ├── build.gradle └── src ├── integration (integration test sources root) │ ├── java │ │ └── com... │ └── resources │ ├── main (sources root) │ ├── java │ │
MyProject
├── build.gradle
└── src
├── integration (integration test sources root)
│ ├── java
│ │ └── com...
│ └── resources
│
├── main (sources root)
│ ├── java
│ │ └── com...
│ └── resources
│
├── test (test sources root)
│ └── java
│ └── com...
│...
我的build.gradle如下所示:
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'java.bike'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
sourceSets {
integration {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
java.srcDirs('./src/integration/java')
resources.srcDirs('./src/integration/resources')
}
}
task integrationTest(type: Test) {
description = 'Runs the integration tests.'
group = 'verification'
testClassesDirs = sourceSets.integration.output.classesDirs
classpath = sourceSets.integration.runtimeClasspath
outputs.upToDateWhen { false }
// This is not needed, but I like to see which tests have run
testLogging { events "passed", "skipped", "failed" }
// mustRunAfter test
}
tasks.withType(Test) {
useJUnitPlatform()
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.assertj:assertj-core'
}
现在,我在src/test
中有两个单元测试,它们工作得非常好
但是,对于集成测试,例如:
package com.bike;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class BorrowMyBikeApplicationTests {
@Test
void contextLoads() {
}
}
它在类路径中找不到任何库,因此,例如对于@SpringBootTest
,它建议将库Gradle:SpringBootTest:2.4.3添加到类路径
,而对于@test
则建议将JUnit4/5添加到类路径
放置在src/test
中的相同测试可以正常工作
当然,我可以接受这些建议,但我必须在每次签出项目时添加这些依赖项。我更喜欢它在集成
文件夹中工作,就像它在测试
文件夹中工作一样
我遗漏了什么,以及如何实现这种配置,使其开箱即用?通过拖网,我找到了答案:
我缺少集成测试的配置,如:
configurations {
integrationImplementation.extendsFrom testImplementation
integrationRuntimeOnly.extendsFrom testRuntimeOnly
}
请注意integrationImplementation.extendsFrom
应该是[集成测试源集的名称]实现。extendsFrom
(在我的例子中是intgeration
),与integrationRuntimeOnly.extendsFrom相同
可选:您还可以扩展您的源集(即使没有,它似乎也可以工作,但我发现这样更干净):
有帮助吗?谢谢,但遗憾的是,没有太多。我已经拥有了所有这些,我的问题是,库/依赖项在集成文件夹中看不到,这是IntelliJ IDEA特有的,或者它也会影响命令行Gradle构建?实际上,两者都是,Gradle无法找到依赖项
sourceSets {
main {
java.srcDirs('./src/main/java')
resources.srcDirs('./src/main/resources')
}
test {
java.srcDirs('./src/test/java')
resources.srcDirs('./src/test/resources')
}
integration {
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
java.srcDirs('./src/integration/java')
resources.srcDirs('./src/integration/resources')
}
}