[英]Spring Cloud Contract generates weak tests using bodyFromFile in contract file
[英]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 類的合約 DSL。
此外,我還注意到使用來自https://github.com/mzielinski/spring-cloud-contract-oa3/blob/develop/src/test/resources/openapi/verify_oa3.yml的示例和您的 build.gradle 文件, scc 在兩個地方(到測試)正確轉換從此文件生成的合同時存在問題:
在 SPOCK 例如生成的測試有這樣的代碼
assertThatJson(parsedJson).field("['request']").isEqualTo("{"path":"/etc/passwd"}")
存在無效轉義。 生成的合約有
body:
path: "/etc/passwd"
所以看起來不錯。
我在生產中使用 sscoa3,我還沒有遇到這樣的問題,但我會嘗試在 SSC 中修復 YamlContract 以正確轉換它。
您還可以通過使用 --debug 標志運行 gradle build 從 YmlContract 看到堆棧跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.