Nexus または Artifactory の REST ドキュメントとスタブを使用したプロバイダー契約のテスト

このフローでは、テストとスタブの生成に Spring Cloud Contract プラグインを使用しません。Spring RESTDocs を記述し、そこからスタブを自動的に生成します。最後に、スタブをパッケージ化してスタブストレージサイト (この場合は Nexus または Artifactory) にアップロードするようにビルドを設定します。

プロデューサーの流れ

プロデューサーとして、次のことを行います。

  1. API の RESTDocs テストを作成します。

  2. 次のように、Spring Cloud Contract Stub Runner スターターをビルド (spring-cloud-starter-contract-stub-runner) に追加します。

    <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>
    dependencies {
    	testImplementation 'org.springframework.cloud:spring-cloud-starter-contract-stub-runner'
    }
    
    dependencyManagement {
    	imports {
    		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    	}
    }
  3. 次のように、スタブをパッケージ化するためのビルドツールをセットアップします。

    • Maven

    • Gradle

    <!-- 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>
    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 契約ベースのアプリケーションの開発を読み取ると、Nexus または Artifactory でスタブを使用してテストするプロバイダ 契約のコンシューマー側のフローを確認できます。