“How-to” 指南
本节提供了一些常见“如何实现...?”问题的解答,这些问题在使用 Spring Cloud Contract 时经常出现。虽然涵盖范围并非详尽无遗,但确实涵盖了相当多的内容。
如果您有我们在此未涵盖的具体问题,您可能需要查看 stackoverflow.com 以了解是否有人已经提供了答案。Stack Overflow 也是提出新问题的好地方(请使用 spring-cloud-contract 标签)。
我们也非常乐意扩展这一部分。如果您想添加“操作指南”,请向我们提交一个pull request。
章节总结
为什么使用 Spring Cloud Contract?
Spring Cloud Contract 在多种语言环境中表现出色。该项目拥有许多非常有趣的功能。其中不少功能确实使 Spring Cloud Contract Verifier 在消费者驱动契约(CDC)工具市场中脱颖而出。最值得关注的功能包括:
如何用 Groovy 以外的语言编写合约?
您可以使用YAML编写合约。更多信息请参阅此部分。
如何为合约提供动态值?
与存根相关的一大挑战在于其可重用性。只有当它们能够被广泛使用时,才能发挥其作用。请求和响应元素中的硬编码值(如日期和ID)通常会使这一点变得困难。考虑以下JSON请求:
如何进行 Stubs 版本管理?
本节将介绍存根(stub)的版本管理,您可以通过多种不同方式进行处理:
如何在不与生产者一起存储合约的情况下使用公共仓库?
另一种存储合约的方式,不是将它们与生产者放在一起,而是保存在一个公共位置。这种情况可能与安全问题有关(消费者无法克隆生产者的代码)。此外,如果将合约保存在单一位置,那么作为生产者,您将知道自己有多少消费者,以及您的本地更改可能会破坏哪些消费者。
如何将 Git 用作合约和桩的存储?
在多语言世界中,存在一些不使用二进制存储的语言,就像 Artifactory 和 Nexus 那样。从 Spring Cloud Contract 2.0.0 版本开始,我们提供了将合约和存根存储在 SCM(源代码管理)仓库中的机制。目前,唯一受支持的 SCM 是 Git。
如何调试生成的测试客户端发送的请求/响应?
生成的测试最终都以某种形式依赖于RestAssured。RestAssured则依赖于Apache HttpClient。HttpClient提供了一种称为\"wire logging\"的功能,可以记录整个请求和响应过程。Spring Boot为此提供了通用的日志记录应用程序属性。要启用此功能,请将其添加到应用程序属性文件中,如下所示:
如何调试 WireMock 发送的映射、请求或响应?
自 1.2.0 版本起,我们将 WireMock 的日志级别设置为 info,并将 WireMock 通知器设为详细模式。现在,你可以准确了解 WireMock 服务器接收到了哪些请求,以及选择了哪个匹配的响应定义。
如何查看 HTTP 服务器存根中注册了哪些内容?
您可以使用 @AutoConfigureStubRunner、StubRunnerRule 或 StubRunnerExtension 上的 mappingsOutputFolder 属性来转储每个构件 ID 的所有映射。此外,还会附加给定存根服务器启动的端口。
如何引用文件中的文本?
在 1.2.0 版本中,我们添加了此功能。你可以在 DSL 中调用 file(…) 方法,并提供相对于合约所在位置的路径。如果使用 YAML,则可以使用 bodyFromFile 属性。
如何从 Spring Cloud Contract 契约生成 YAML 或 X 文件?
Spring Cloud Contract 附带了一个 ToFileContractsTransformer 类,它允许您将合约作为文件转储给指定的 ContractConverter。它包含一个静态的 void main 方法,允许您将转换器作为可执行文件运行。它接受以下参数:
如何处理传递依赖?
Spring Cloud Contract 插件会添加用于创建存根 jar 的任务。但出现的一个问题是,在复用存根时,你可能会错误地导入该存根的所有依赖项。在构建 Maven 构件时,即使你有几个不同的 jar 包,它们都共享同一个 pom.xml 文件,如下面的清单所示:
如何从契约生成 Spring REST Docs 片段?
当您想要通过使用 Spring REST Docs 来包含 API 的请求和响应时,如果您正在使用 MockMvc,只需对设置进行一些小的更改。为此,请包含以下依赖项(如果尚未包含):
如何从指定位置使用存根
如果您希望在不克隆仓库或获取 JAR 文件的情况下从指定位置获取合约或存根,可以在为 Stub Runner 或 Spring Cloud Contract 插件提供仓库根参数时使用 stubs:// 协议。您可以在文档的此部分了解更多相关信息。
如何在运行时生成存根
若要在运行时为合约生成存根,请切换 @AutoConfigureStubRunner 注解中的 generateStubs 属性,或在 JUnit Rule 或 Extension 上调用 withGenerateStubs(true) 方法。您可以在文档的此部分中了解更多相关信息。
如果没有合约或存根,我该如何使构建通过
如果你希望 Stub Runner 在没有找到存根时不报错,可以在 @AutoConfigureStubRunner 注解中切换 generateStubs 属性,或者在 JUnit Rule 或 Extension 上调用 withFailOnNoStubs(false) 方法。你可以在文档的这一部分了解更多信息。
如何标记合同正在执行中
如果合约正在处理中,这意味着在生产者端,测试尚未生成,但存根已生成。您可以在文档的此部分中了解更多信息。