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



当我在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

我的构建。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'。请把它移到testimimplementation中。然后,您应该能够在/tmp/scoa3___中看到生成的合同。yml文件

spring-cloud-contract-oa3通常将open-api转换为/tmp目录下的yaml合约,然后这些文件用于从SSC生成带有YmlContract类的合约dsl。

此外,我注意到也使用我的例子从https://github.com/mzielinski/spring-cloud-contract-oa3/blob/develop/src/test/resources/openapi/verify_oa3.yml和你的构建。Gradle文件,SCC在两个地方(到测试)正确转换从该文件生成的契约有问题:

  • 消息:'请求中提供的路径是:{{{jsonpath this "$.path"}}}"。
  • body: path: '/etc/passwd'

以SPOCK为例,生成的测试有这样的代码

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

转义无效。生成的合约有

body:
path: "/etc/passwd"

so look OK.

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

你也可以通过运行gradle build和——debug标志来查看来自YmlContract的堆栈跟踪。

最新更新