三秒钟速览
在生产者端
要开始使用 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-plugin` 中 `configuration` 元素的子元素。 |
一旦实现和测试基础类就绪,测试就会通过,并且应用程序和存根工件都会构建并安装到本地 Maven 仓库中。你现在可以合并更改,并且可以将应用程序和存根工件发布到在线仓库中。
在消费者端
你可以在集成测试中使用 `Spring Cloud Contract Stub Runner` 来获取一个运行中的 WireMock 实例或消息路由,以模拟实际服务。
为此,请添加对 `Spring Cloud Contract Stub Runner` 的依赖,如下面的示例所示:
你可以通过以下两种方式将生产者端存根安装到你的 Maven 仓库中:
-
通过检出生产者端仓库并添加契约,然后运行以下命令生成存根:
$ cd local-http-server-repo $ ./mvnw clean install -DskipTests
| 测试被跳过,因为生产者端契约实现尚未就绪,所以自动生成的契约测试会失败。 |
-
通过从远程仓库获取已有的生产者服务存根。为此,将存根工件 ID 和工件仓库 URL 作为 `Spring Cloud Contract Stub Runner` 属性传递,如下面的示例所示:
现在你可以使用 `@AutoConfigureStubRunner` 注解你的测试类。在注解中,为 `Spring Cloud Contract Stub Runner` 提供 `group-id` 和 `artifact-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 响应或消息的存根版本。