Spring Cloud Contracts插件自定义sourceSet运行契约测试问题
解决Spring Cloud Contracts 2.x在独立contractTest SourceSet运行测试的问题
你观察得完全正确——Spring Cloud Contract Verifier插件2.x版本(包括你用的2.0.2.RELEASE)确实在GenerateServerTestsTask里硬编码了把生成的测试类注册到test sourceSet,这就是为什么即使你配置了独立的contractTest目录,插件还是会往test目录找资源的原因。不过我们可以通过自定义Gradle任务和覆盖插件默认行为来绕开这个限制,实现契约测试在独立目录运行。
步骤1:完善SourceSet与依赖配置
先补全你现有的sourceSet和依赖配置,确保contractTest能正确访问主代码、契约依赖,以及后续生成的测试类:
sourceSets { contractTest { groovy { srcDir 'src/contractTest/groovy' // 提前声明插件生成测试的存放目录 srcDir "${buildDir}/generated-sources/contracts/contractTest" } resources { srcDir 'src/contractTest/resources' } // 让contractTest继承主代码和test的依赖 compileClasspath += sourceSets.main.output + configurations.testImplementation runtimeClasspath += sourceSets.main.output + configurations.testRuntimeOnly } } configurations { contractTestImplementation.extendsFrom implementation, testImplementation contractTestRuntimeOnly.extendsFrom runtimeOnly, testRuntimeOnly } task contractTest(type: Test) { description = 'Runs contract tests.' group = 'verification' testClassesDirs = sourceSets.contractTest.output.classesDirs classpath = sourceSets.contractTest.runtimeClasspath shouldRunAfter integrationTest // 启用JUnit 5测试引擎(匹配你引入的依赖) useJUnitPlatform() }
步骤2:覆盖GenerateServerTestsTask的默认行为
我们需要修改插件的默认任务逻辑,让它把生成的测试源码加到contractTest而非test sourceSet,同时调整生成路径到contractTest专属目录:
// 定位插件的GenerateServerTestsTask任务,修改其配置 tasks.withType(org.springframework.cloud.contract.verifier.plugin.GenerateServerTestsTask) { task -> // 重定向生成测试的输出目录到contractTest专属路径 task.configProperties.generatedTestSourcesDir = new File("${buildDir}/generated-sources/contracts/contractTest") // 移除插件默认的test sourceSet关联,改为绑定到contractTest doFirst { project.sourceSets.test.groovy.srcDirs.remove(task.configProperties.generatedTestSourcesDir) project.sourceSets.contractTest.groovy.srcDir task.configProperties.generatedTestSourcesDir } } // 确保生成测试的任务在contractTest编译前执行 tasks.named('compileContractTestGroovy').configure { dependsOn 'generateContractTests' }
步骤3:调整Contracts插件核心配置
更新你的contracts块,确保契约文件路径和基础类包与contractTest目录对齐:
contracts { packageWithBaseClasses = 'com.test.testapi.contracts' // 指定契约文件所在的contractTest资源目录 contractsDslDir = new File("${project.rootDir}/src/contractTest/resources/contracts/") // 如果你确认当前版本支持JUnit 5,可以启用该配置 // testFramework = 'JUNIT5' }
步骤4:验证配置生效
- 执行
./gradlew generateContractTests,检查build/generated-sources/contracts/contractTest目录下是否生成了对应测试类 - 执行
./gradlew contractTest,确认任务会执行这些生成的契约测试,且不会干扰原有的test任务
关键说明
- 这个方案是针对2.x版本插件硬编码限制的临时 workaround,如果你后续升级到Spring Cloud Contract 3.x及以上版本,插件已经支持通过
verifier.sourceSet属性直接指定自定义sourceSet,配置会简洁很多 - 请确保你的基础测试类放在
src/contractTest/groovy/com/test/testapi/contracts目录下,这样生成的测试才能正确继承
内容的提问来源于stack exchange,提问作者bubblebath
相关产品推荐
相关产品推荐

