使用 spring-cloud-contract-oa3 和 spring 云合同 gradle 插件时无法生成合同测试

Unable to generate contract tests when using spring-cloud-contract-oa3 and spring cloud contract gradle plugin

当我在 OA3 yml 文件中指定合同然后构建项目时,构建通过但不生成合同测试。如果我将 OA3 yml 合同文件替换为 groovy 等效文件,则构建通过并生成并运行合同测试。

我有以下设置:

我的 build.gradle 看起来像:

buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
    dependencies {
        classpath 'org.springframework.cloud:spring-cloud-contract-gradle-plugin:3.1.2'
        classpath 'com.github.mzielinski:spring-cloud-contract-oa3:3.1.2.0'
    }
}

plugins {
    id 'org.springframework.boot' version '2.6.8'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'war'
    id 'java-library'
    id 'maven-publish'
    id 'com.adarshr.test-logger' version '3.0.0'
    id "org.unbroken-dome.test-sets" version "4.0.0"
    id 'groovy'
}

apply plugin: 'spring-cloud-contract'

testSets {
    contractTest
}


ext {
    springBootStarterVersion = '2.6.8'
    springCloudVersion = '2021.0.3'
    projectLombokVersion = '1.18.24'
}

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'

    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'

    testImplementation unitTesting

    testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier'
    
    compileOnly "org.projectlombok:lombok:${projectLombokVersion}"
    annotationProcessor "org.projectlombok:lombok:${projectLombokVersion}"
    testAnnotationProcessor "org.projectlombok:lombok:${projectLombokVersion}"
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}

contractTest {
    useJUnitPlatform()
}

contracts {
    testFramework = org.springframework.cloud.contract.verifier.config.TestFramework.JUNIT5
    baseClassForTests = 'com.my.project.contract.BaseContractTest'
    testMode = 'MockMvc'
    contractsPath = 'src/contractTest/resources/contracts'
}

}

@Lamminski,我想,我能够重现你的问题。

第一个问题是 buildSrc 中的 'com.github.mzielinski:spring-cloud-contract-oa3:3.1.2.0'。请将它移到 testImplementation 中。然后你应该能够在 /tmp/sccoa3___.yml 文件

中看到生成的合同

通常,spring-cloud-contract-oa3 将 open-api 转换为 /tmp 目录中的 yaml 合约,然后这些文件用于使用来自 SSC 的 YmlContract class 生成合约 DSL。

此外,我还注意到使用 https://github.com/mzielinski/spring-cloud-contract-oa3/blob/develop/src/test/resources/openapi/verify_oa3.yml 和您的 build.gradle 文件中的示例时,scc 无法在两个地方正确转换从该文件生成的合同(用于测试):

  • 留言:'Provided path in request is: {{{ jsonpath this "$.path" }}}.'
  • 正文:路径:'/etc/passwd'

例如在 SPOCK 中生成的测试有这样的代码

assertThatJson(parsedJson).field("['request']").isEqualTo("{"path":"/etc/passwd"}")

转义无效。生成的合约有

  body:
    path: "/etc/passwd"

看起来不错。

我在生产中使用 sscoa3,我还没有遇到这样的问题,但我会尝试修复 SSC 中的 YamlContract 以正确的方式转换它。

您还可以通过 运行 gradle 使用 --debug 标志构建来查看 YmlContract 的堆栈跟踪。