A Three-second Tour

此非常简短的教程介绍了如何使用 Spring Cloud Contract。它包括以下主题:

您可在 here 中找到更详尽的教程。 以下 UML 图显示了 Spring Cloud Contract 中各部分之间的关系:

"API Producer"->"API Producer": add Spring Cloud \nContract (SCC) plugin
"API Producer"->"API Producer": add SCC Verifier dependency
"API Producer"->"API Producer": define contracts
"API Producer"->"Build": run build
"Build"->"SCC Plugin": generate \ntests, stubs and stubs \nartifact (e.g. stubs-jar)
"Build"->"Stub Storage": upload contracts \nand stubs and the project arifact
"Build"->"API Producer": Build successful
"API Consumer"->"API Consumer": add SCC Stub Runner \ndependency
"API Consumer"->"API Consumer": write a SCC Stub Runner \nbased contract test
"SCC Stub Runner"->"Stub Storage": test asks for [API Producer] stubs
"Stub Storage"->"SCC Stub Runner": fetch the [API Producer] stubs
"SCC Stub Runner"->"SCC Stub Runner": run in memory\n HTTP server stubs
"API Consumer"->"SCC Stub Runner": send a request \nto the HTTP server stub
"SCC Stub Runner"->"API Consumer": communication is correct

On the Producer Side

要开始使用 Spring Cloud Contract,您可以将用 Groovy DSL 或 YAML 表示的 REST 或消息契约文件添加到契约目录中,该目录由 contractsDslDir 属性设置。默认情况下,它是 $rootDir/src/test/resources/contracts

然后您可以将 Spring Cloud Contract Verifier 依赖项和插件添加到您的构建文件中,如下例所示:

link:{samples_path}/standalone/dsl/http-server/pom.xml[role=include]

以下清单显示了如何添加插件,该插件应位于文件的 build/plugin 部分:

<plugin>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-contract-maven-plugin</artifactId>
	<version>${spring-cloud-contract.version}</version>
	<extensions>true</extensions>
</plugin>

运行 ./mvnw clean install 将自动生成测试,以验证应用程序是否符合添加的合同。默认情况下,测试会生成在 org.springframework.cloud.contract.verifier.tests. 下。

由于尚未实现由合同描述的功能,因此测试失败。

要通过它们,必须添加正确实现的 HTTP 请求或消息处理。此外,必须为自动生成的测试向项目添加一个基本测试类。这个类由所有自动生成的测试扩展,它应包含运行它们所需的所有设置信息(例如 RestAssuredMockMvc 控制器设置或消息测试设置)。

以下示例来自 pom.xml,展示了如何指定基本测试类:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-contract-maven-plugin</artifactId>
                <version>2.1.2.RELEASE</version>
                <extensions>true</extensions>
                <configuration>
                    <baseClassForTests>com.example.contractTest.BaseTestClass</baseClassForTests> 1
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
1 baseClassForTests 元素让你可以选择你的基本测试类。它必须是 spring-cloud-contract-maven-pluginconfiguration 元素的一个子元素。

一旦实现和测试基类就位,则测试通过,并且应用程序和存根工件在本地 Maven 存储库中构建并安装。您现在可以合并更改,并且可以将应用程序和存根工件发布到在线存储库中。

On the Consumer Side

您可以在集成测试中使用 Spring Cloud Contract Stub Runner 获得正在运行的 WireMock 实例或模拟实际服务的邮件路由。

若要执行此操作,添加对 Spring Cloud Contract Stub Runner 的依赖项,如下例所示:

link:{samples_path}/standalone/dsl/http-client/pom.xml[role=include]

您可以采用两种方式之一在您的 Maven 存储库中安装 Producer 端存根:

  • 通过签出 Producer 侧存储库并通过运行以下命令添加契约和生成存根:[source, bash]

$ cd local-http-server-repo
$ ./mvnw clean install -DskipTests

测试被跳过,因为生产者端合约实现尚未到位,因此导致自动生成的合约测试失败。

  • 从远程存储库获取已经存在的 producer 服务存根。为此,传递存根工件 ID 和工件存储库 URL 作为 Spring Cloud Contract Stub Runner 属性,如下例所示:[source, yaml]

link:{samples_path}/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[role=include]

现在您可以使用 @AutoConfigureStubRunner 批注您的测试类。在批注中,提供 Spring Cloud Contract Stub Runnergroup-idartifact-id 值,以便为您运行协作者的存根,如下例所示:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"},
		stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class LoanApplicationServiceTests {
	. . .
}

在线储存库中下载存根时,请使用 REMOTE stubsMode,而离线工作时则使 LOCAL

现在,在您的集成测试中,您可以收到预期由协作服务发出的 HTTP 响应或消息的存根版本。