【问题标题】:Spring cloud contracts plugin change sourcesetSpring Cloud Contracts 插件更改源集
【发布时间】:2019-06-13 13:43:11
【问题描述】:

我已经开始在我的项目中使用 Spring Cloud Contracts ('2.0.2.RELEASE'),并且我有以下结构

src
|
  -- main
  -- test
  -- integrationTest
  -- contractTest

当我将我的合同和我的基础测试类进行测试时,它运行良好。我想将我编写的合同测试移动到一个单独的源集中,即 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'

我想我需要设置合约插件属性contractDependency,但是我不确定也找不到让插件与这个不同的源集一起工作的示例

TLDR;我希望能够在不同的文件夹中运行我的合同测试

更新 - 我不确定,但我认为这是不可能的,因为在“GenerateServerTestsTask.groovy”文件中的 Gradle 插件中具有以下内容,这似乎表明 sourceSet 被硬编码以在整个代码中进行测试

project.sourceSets.test.groovy {
    project.logger.
            info("Registering ${getConfigProperties().generatedTestSourcesDir} as test source directory")
    srcDir getConfigProperties().getGeneratedTestSourcesDir()
}

【问题讨论】:

  • 我不认为你是对的。该代码所说的是它将生成的测试添加到类路径中。您想更改存储联系人的来源吗?您必须设置 gradle 插件并提供新位置
  • 感谢您回来。我想设置插件以使用我的新“contractTest”测试任务。这是一个独立于正常测试任务的测试任务。我个人只为我的单元测试进行测试,并希望我的合同和基类在新的 contractTest 源集中。我相信合约插件依赖于检查任务。测试任务取决于检查,所以我的情况是 gradle 插件只能使用测试类路径运行。如果有更好的方法来讨论这个或解释更多,请告诉我。如果这是一个增强,我会热衷于 PR 回来
  • 请在@Github 创建一个示例,并在 README.adoc 中描述您想要实现的具体目标以及如何复制问题
  • @MarcinGrzejszczak 我现在已经做到了。 github.com/Budlee/ContractTestDemo谢谢
  • 我不是 Gradle 专家。似乎类路径中缺少第一个 Groovy(如果您取消注释 testImplementation 'org.codehaus.groovy:groovy-all:2.4.6',则缺少其他一些内容)。我不认为这是 sc-contract 的问题,而是 Gradle 设置的问题。

标签: spring spring-boot gradle spring-cloud spring-cloud-contract


【解决方案1】:

为了将来参考,我可以通过创建一个自定义任务来从测试源集中取消注册生成的源,这样它们就不会被 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'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多