跳到主要内容

在 Nexus 或 Artifactory 中使用 REST Docs 和 Stubs 进行提供者契约测试

DeepSeek V3 中英对照 Provider Contract Testing with REST Docs and Stubs in Nexus or Artifactory

在此流程中,我们不使用Spring Cloud Contract插件来生成测试和存根。我们编写Spring RESTDocs,并从中自动生成存根。最后,我们设置构建过程来打包存根,并将其上传到存根存储站点——在我们的案例中是Nexus或Artifactory。

生产者流程​

作为生产者,我们:

  1. 为我们的 API 编写 RESTDocs 测试。

  2. 将 Spring Cloud Contract Stub Runner starter 添加到我们的构建中 (spring-cloud-starter-contract-stub-runner),如下所示:

    Maven

    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    Gradle

    dependencies {
    testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-stub-runner'
    }

    dependencyManagement {
    imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
    }
  3. 我们设置构建工具来打包我们的存根,如下所示:

    Maven

    <!-- pom.xml -->
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
    <execution>
    <id>stub</id>
    <phase>prepare-package</phase>
    <goals>
    <goal>single</goal>
    </goals>
    <inherited>false</inherited>
    <configuration>
    <attach>true</attach>
    <descriptors>
    ${basedir}/src/assembly/stub.xml
    </descriptors>
    </configuration>
    </execution>
    </executions>
    </plugin>
    </plugins>

    <!-- src/assembly/stub.xml -->
    <assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>stubs</id>
    <formats>
    <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
    <fileSet>
    <directory>${project.build.directory}/generated-snippets/stubs</directory>
    <outputDirectory>META-INF/${project.groupId}/${project.artifactId}/${project.version}/mappings</outputDirectory>
    <includes>
    <include>**/*</include>
    </includes>
    </fileSet>
    </fileSets>
    </assembly>

    Gradle

    task stubsJar(type: Jar) {
    classifier = "stubs"
    into("META-INF/${project.group}/${project.name}/${project.version}/mappings") {
    include('**/*.*')
    from("${project.buildDir}/generated-snippets/stubs")
    }
    }
    // we need the tests to pass to build the stub jar
    stubsJar.dependsOn(test)
    bootJar.dependsOn(stubsJar)

现在,当我们运行测试时,存根会自动发布并打包。

以下 UML 图展示了生产者流程:

flows-provider-rest-docs-producer

消费者流程​

由于消费者流程不受生成存根的工具影响,您可以阅读开发首个基于Spring Cloud Contract的应用来了解在Nexus或Artifactory中使用存根进行提供方契约测试的消费者端流程。