Gradle任务报MissingPropertyException:如何让integrationTest属性被识别?
问题分析
你遇到的错误是因为仅注册了integrationTest任务,但未创建对应的integrationTest SourceSet:
Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'integrationTest' for SourceSet container of type org.gradle.api.internal.tasks.DefaultSourceSetContainer.
Gradle的Java插件默认只提供main和test两个SourceSet,自定义SourceSet必须显式声明,否则sourceSets容器中不存在integrationTest属性。
解决方案
需要先定义integrationTest SourceSet,再关联任务与依赖,以下是完整修改方案:
1. 添加SourceSet配置
在build.gradle中新增sourceSets块,声明集成测试的源码目录,并配置依赖继承关系:
sourceSets { integrationTest { java { srcDir 'src/integrationTest/java' } resources { srcDir 'src/integrationTest/resources' } // 集成测试依赖主代码输出和测试运行时依赖 compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath runtimeClasspath += output + compileClasspath } }
2. 配置集成测试专属依赖
添加对应的依赖配置,让集成测试可以继承单元测试的依赖,也能单独添加专属依赖:
configurations { integrationTestImplementation.extendsFrom testImplementation integrationTestRuntimeOnly.extendsFrom testRuntimeOnly }
3. 调整integrationTest任务
现在sourceSets.integrationTest已存在,可正常引用,同时可以给任务添加描述和分组:
tasks.register('integrationTest', Test) { description = 'Runs integration tests.' group = 'Verification' testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath shouldRunAfter test // 确保集成测试在单元测试后执行 }
修改后的完整
build.gradle plugins { id 'java' id 'org.springframework.boot' version '2.7.8' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.app.api' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } // 定义integrationTest SourceSet sourceSets { integrationTest { java { srcDir 'src/integrationTest/java' } resources { srcDir 'src/integrationTest/resources' } compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath runtimeClasspath += output + compileClasspath } } // 配置集成测试依赖继承 configurations { integrationTestImplementation.extendsFrom testImplementation integrationTestRuntimeOnly.extendsFrom testRuntimeOnly } dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'junit:junit:4.13.1' // 可在此添加集成测试专属依赖 // integrationTestImplementation 'some.dependency:integration-lib:1.0.0' } // 注册并配置集成测试任务 tasks.register('integrationTest', Test) { description = 'Runs integration tests.' group = 'Verification' testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath shouldRunAfter test } tasks.withType(Jar).configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes["Main-Class"] = 'com.app.api.ApiApplication' } configurations["compileClasspath"].each { file -> from(zipTree(file.absoluteFile)) } }
补充说明
- 定义SourceSet后,Gradle会自动识别
src/integrationTest/java和src/integrationTest/resources作为集成测试的源码与资源目录; integrationTestImplementation继承自testImplementation,单元测试的依赖会自动被集成测试复用;shouldRunAfter test保证测试执行顺序符合常规流程,避免集成测试依赖单元测试未验证的代码。
内容的提问来源于stack exchange,提问作者Adi Sivasankaran
相关产品推荐
相关产品推荐

