三分钟快速上手
在生产者侧
要开始使用 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 元素的子元素。 |
一旦实现和测试基础类到位,测试将通过,并且应用程序和存根 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-id
和 artifact-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 响应或消息的存根版本。