簡體   English   中英

使用spring-cloud-contract-oa3和spring cloud contract 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'
  • 畢業 7.3.2
  • 爪哇 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 類的合約 DSL。

此外,我還注意到使用來自https://github.com/mzielinski/spring-cloud-contract-oa3/blob/develop/src/test/resources/openapi/verify_oa3.yml的示例和您的 build.gradle 文件, scc 在兩個地方(到測試)正確轉換從此文件生成的合同時存在問題:

  • 消息:'請求中提供的路徑是:{{{ jsonpath this "$.path" }}}。'
  • 正文:路徑:'/etc/passwd'

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM