三分钟快速上手

本简短教程将介绍如何使用 Spring Cloud Contract。它包含以下主题:

你可以在这里找到一个稍长的教程。

以下 UML 图展示了 Spring Cloud Contract 中各部分的关系

getting-started-three-second

在生产者侧

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

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

以下列表展示了如何添加插件,它应该放在文件中的 build/plugins 部分

<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 元素的子元素。

一旦实现和测试基础类到位,测试将通过,并且应用程序和存根 artifact 都将被构建并安装到本地 Maven 仓库中。你现在可以合并更改,并可以在在线仓库中发布应用程序和存根 artifact。

在消费者侧

你可以在集成测试中使用 Spring Cloud Contract Stub Runner 来获得一个运行中的 WireMock 实例或消息路由,以模拟实际服务。

为此,请添加 Spring Cloud Contract Stub Runner 的依赖,如下例所示:

你可以通过以下两种方式之一将生产者侧的存根安装到你的 Maven 仓库中:

  • 通过签出生产者侧仓库,并添加契约,然后运行以下命令生成存根:

    $ cd local-http-server-repo
    $ ./mvnw clean install -DskipTests
测试被跳过,因为生产者侧的契约实现尚未到位,因此自动生成的契约测试会失败。
  • 通过从远程仓库获取已存在的生产者服务存根。为此,请将存根 artifact ID 和 artifact 仓库 URL 作为 Spring Cloud Contract Stub Runner 的属性传递,如下例所示:

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

@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 响应或消息的存根版本。