Gradle Java项目中单元测试与集成测试必须物理隔离,因混用src/test会导致test任务变慢、CI卡顿、JaCoCo报告污染及IDE无法识别;应配置独立integration sourceSet并注册integrationTest任务,确保快速反馈与构建可靠性。

Gradle Java项目里,单元测试和集成测试必须物理隔离,否则 ./gradlew test 会把慢的数据库连接、HTTP调用全塞进快速反馈循环里——你改个 DTO 就得等 40 秒看测试结果,这不是测试,是惩罚。
为什么不能共用 src/test
单元测试(test)要求毫秒级执行、无外部依赖;集成测试(如连 MySQL、Kafka、Spring Boot Context)必然带启动开销。混在同一个 sourceSet 会导致:
-
test任务变慢,CI 流水线卡在“验证基础逻辑”这一步 - 无法单独禁用集成测试做快速本地验证
- JaCoCo 覆盖率报告被集成测试的样板代码污染(比如
@SpringBootTest类本身不贡献业务逻辑覆盖率) - IDE(如 IntelliJ)默认只识别
src/test,dbtest或integration目录里的测试类不自动提示、不支持右键运行
怎么配置独立的 integration SourceSet
在 build.gradle(或 build.gradle.kts)里声明新源集,并绑定编译/运行时 classpath:
sourceSets {
integration {
java.srcDir 'src/integration/java'
resources.srcDir 'src/integration/resources'
compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath
runtimeClasspath += output + compileClasspath
}
}
关键点:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 路径名用
integration比dbtest更通用,避免后续加 Kafka、Redis 测试时还得改名 -
compileClasspath += ...testRuntimeClasspath是为了让集成测试能引用@MockBean、TestRestTemplate等测试专用依赖 - 别漏掉
runtimeClasspath += output,否则@Value("${app.config}")这类属性注入会失败
怎么注册可执行的 integrationTest 任务
Gradle 不会自动为自定义 sourceSet 创建测试任务,必须手动注册:
tasks.register('integrationTest', Test) {
description = 'Runs integration tests.'
group = 'verification'
testClassesDirs = sourceSets.integration.output.classesDirs
classpath = sourceSets.integration.runtimeClasspath
useJUnitPlatform()
shouldRunAfter test
}
check.dependsOn integrationTest
注意:
-
useJUnitPlatform()必须显式调用,否则 JUnit 5 的@ExtendWith扩展(如 SpringExtension)不生效 -
shouldRunAfter test不影响执行顺序,只是让./gradlew check输出里integrationTest排在test后面,符合直觉 -
check.dependsOn integrationTest是硬性要求:CI 流水线跑./gradlew check时,集成测试失败必须导致构建失败
IDE 和命令行怎么用才不踩坑
IntelliJ 默认不认 src/integration,需手动标记目录为 “Test Sources”:
- 右键
src/integration/java→Mark as Test Sources - 右键
src/integration/resources→Mark as Test Resources - 重启 IDE 或刷新 Gradle 项目(
Reload project)
命令行常用操作:
- 只跑单元测试:
./gradlew test - 只跑集成测试:
./gradlew integrationTest - 跳过集成测试(开发时省时间):
./gradlew test -x integrationTest - 查看集成测试报告:
build/reports/tests/integrationTest/index.html
最容易被忽略的是资源加载路径——集成测试里用 ClassPathResource("application-integration.yml") 时,确保该文件放在 src/integration/resources 下,而不是 src/test/resources。否则 Spring Boot 启动报 FileNotFoundException,但错误堆栈里根本不会提“资源没找到”,只会卡在 context refresh 失败,查半天才发现是路径错了。

















