我已经开始在我的项目中使用 Spring Cloud Contracts ('2.0.2.RELEASE') 并且我有以下结构
src
|
-- main
-- test
-- integrationTest
-- contractTest
当我将我的契约(Contract)和我的基础测试类放入测试中时,它运行良好。我想将我编写的契约(Contract)测试移动到一个单独的源集中,即 contractTest 源。但是,这将不起作用,因为插件 generateContractTests
任务在尝试运行时仍会在测试源集中查找。
我对我的 Gradle 文件进行了以下更改
task contractTest(type: Test) {
description = 'Runs contract tests.'
group = 'verification'
testClassesDirs = sourceSets.contractTest.output.classesDirs
classpath = sourceSets.contractTest.runtimeClasspath
shouldRunAfter integrationTest
}
configurations {
contractTestImplementation.extendsFrom implementation
contractTestRuntimeOnly.extendsFrom runtimeOnly
}
sourceSets {
contractTest {
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
}
}
contracts {
// testFramework = 'JUNIT5'
packageWithBaseClasses = 'com.test.testapi.contracts'
contractsDslDir = new File("${project.rootDir}/src/contractTest/resources/contracts/")
}
contractTestImplementation 'org.codehaus.groovy:groovy-all:2.4.6'
contractTestImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier'
contractTestImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api'
contractTestImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine'
我想我需要设置契约(Contract)插件属性 contractDependency
,但是,我不确定也找不到示例来让插件与这个不同的源集一起工作
TLDR;我希望能够在不同的文件夹中运行我的契约(Contract)测试
更新 - 我不确定,但我认为这是不可能的,因为在“GenerateServerTestsTask.groovy”文件中的 Gradle 插件中有以下内容,这似乎表明 sourceSet 被硬编码以在整个代码中进行测试
project.sourceSets.test.groovy {
project.logger.
info("Registering ${getConfigProperties().generatedTestSourcesDir} as test source directory")
srcDir getConfigProperties().getGeneratedTestSourcesDir()
}
最佳答案
为了将来引用,我能够通过创建一个自定义任务来使它工作,以从测试源集中注销生成的源,这样它们就不会被 compileTestJava 编译,并且可以通过我自己的 contractTests 任务运行。
sourceSets {
contractTest {
java {
compileClasspath += sourceSets.main.output + sourceSets.test.output
runtimeClasspath += sourceSets.main.output + sourceSets.test.output
srcDir file('src/contractTest/java')
srcDirs += file("${buildDir}/generated-contract-sources/")
}
resources.srcDir file('src/contractTest/resources')
}
}
task deregisterContractTestSources() {
doLast {
project.sourceSets.test.java {
project.logger.info('Removing any *Spec classes from the test sources')
exclude '**/*Spec*'
}
}
}
compileTestJava.dependsOn deregisterContractTestSources
task contractTests(type: Test) {
description = 'Runs contract tests'
group = 'verification'
testClassesDirs = sourceSets.contractTest.output.classesDirs
classpath = sourceSets.contractTest.runtimeClasspath
}
contracts {
baseClassForTests = 'com'
generatedTestSourcesDir = file("${buildDir}/generated-contract-sources")
generatedTestResourcesDir = file("${buildDir}/generated-contract-resources/")
testFramework = "JUNIT5"
contractsDslDir = new File("${projectDir}/src/contractTest/resources/contracts/")
nameSuffixForTests = 'Spec'
basePackageForTests = 'com'
}
关于Spring cloud contracts插件更改源集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54268428/