使用 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 等效文件,则构建通过并生成并运行合同测试。
我有以下设置:
- com.github.mzielinski:spring-cloud-contract-oa3:3.1.2.0'
- 'org.springframework.cloud:spring-cloud-contract-gradle-plugin:3.1.2'
- 'org.springframework.cloud:spring-cloud-dependencies:2021.0.3'
- gradle 7.3.2
- java 8
我的 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 的堆栈跟踪。
当我在 OA3 yml 文件中指定合同然后构建项目时,构建通过但不生成合同测试。如果我将 OA3 yml 合同文件替换为 groovy 等效文件,则构建通过并生成并运行合同测试。
我有以下设置:
- com.github.mzielinski:spring-cloud-contract-oa3:3.1.2.0'
- 'org.springframework.cloud:spring-cloud-contract-gradle-plugin:3.1.2'
- 'org.springframework.cloud:spring-cloud-dependencies:2021.0.3'
- gradle 7.3.2
- java 8
我的 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 的堆栈跟踪。