Using the Pluggable Architecture
您可能会遇到您的合同以其他格式定义的情况,例如 YAML、RAML 或 PACT。在这些情况下,您仍然希望利用生成测试和存根的自动化功能。您可为测试和存根的生成添加您自己的实现。此外,您可以自定义生成测试的方式(例如,您可以生成其他语言的测试)和生成存根的方式(例如,您可以生成其他 HTTP 服务器实现的存根)。
Custom Contract Converter
ContractConverter
接口允许您注册您自己的合同结构转换器实现。以下代码清单演示了 ContractConverter
接口:
Unresolved directive in pluggable-architecture.adoc - include::{contract_spec_path}/src/main/java/org/springframework/cloud/contract/spec/ContractConverter.java[]
您的实现必须定义它应开始转换的条件。另外,您必须定义如何在两个方向执行转换。
创建实现后,您必须创建一个 /META-INF/spring.factories
文件,其中提供您实现的完全限定名称。
以下示例演示了一个典型的 spring.factories
文件:
org.springframework.cloud.contract.spec.ContractConverter=\
org.springframework.cloud.contract.verifier.converter.YamlContractConverter
Using the Custom Test Generator
如果您想要生成 Java 以外的语言的测试或者您对验证者生成 Java 测试的方式不满意,您可以注册您自己的实现。
SingleTestGenerator
接口允许您注册您自己的实现。以下代码清单演示了 SingleTestGenerator
接口:
Unresolved directive in pluggable-architecture.adoc - include::{verifier_root_path}/src/main/java/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.java[]
同样,您必须提供一个 spring.factories
文件,例如以下示例中所示:
org.springframework.cloud.contract.verifier.builder.SingleTestGenerator=/
com.example.MyGenerator
Using the Custom Stub Generator
如果您想要生成 WireMock 以外的存根服务器的存根,您可以插入您自己的 StubGenerator
接口实现。以下代码清单演示了 StubGenerator
接口:
Unresolved directive in pluggable-architecture.adoc - include::{converters_path}/src/main/java/org/springframework/cloud/contract/verifier/converter/StubGenerator.java[]
同样,您必须提供一个 spring.factories
文件,例如以下示例中所示:
Unresolved directive in pluggable-architecture.adoc - include::{converters_path}/src/main/resources/META-INF/spring.factories[]
默认实现是 WireMock 存根生成。
您可以提供多个存根生成器实现。例如,您可以从一个 DSL 生成 WireMock 存根和 Pact 文件。 |
Using the Custom Stub Runner
如果您决定使用自定义存根生成,您还需要一种使用您的不同存根提供商运行存根的自定义方式。
假设您使用 Moco构建存根,并且您编写了一个存根生成器并将存根放置在JAR文件中。
为了让存根运行器了解如何运行您的存根,您必须定义一个自定义 HTTP 存根服务器实现,它可能类似于以下示例:
Unresolved directive in pluggable-architecture.adoc - include::{tests_path}/spring-cloud-contract-stub-runner-moco/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/moco/MocoHttpServerStub.groovy[]
然后您可以在您的 spring.factories
文件中注册它,如下例所示:
org.springframework.cloud.contract.stubrunner.HttpServerStub=\
org.springframework.cloud.contract.stubrunner.provider.moco.MocoHttpServerStub
现在,您可以使用 Moco 运行存根。
如果您不提供任何实现,则使用默认(WireMock)实现。如果您提供了多个,则使用列表中的第一个。
Using the Custom Stub Downloader
您可以通过创建一个 StubDownloaderBuilder
接口的实现来自定义下载存根的方式,如下例所示:
package com.example;
class CustomStubDownloaderBuilder implements StubDownloaderBuilder {
@Override
public StubDownloader build(final StubRunnerOptions stubRunnerOptions) {
return new StubDownloader() {
@Override
public Map.Entry<StubConfiguration, File> downloadAndUnpackStubJar(
StubConfiguration config) {
File unpackedStubs = retrieveStubs();
return new AbstractMap.SimpleEntry<>(
new StubConfiguration(config.getGroupId(), config.getArtifactId(), version,
config.getClassifier()), unpackedStubs);
}
File retrieveStubs() {
// here goes your custom logic to provide a folder where all the stubs reside
}
}
}
}
然后您可以在您的 spring.factories
文件中注册它,如下例所示:
# Example of a custom Stub Downloader Provider
org.springframework.cloud.contract.stubrunner.StubDownloaderBuilder=\
com.example.CustomStubDownloaderBuilder
现在您可以使用存根的源目录选择一个文件夹。
如果您不提供任何实现,则使用默认(扫描类路径)。如果您提供 stubsMode = StubRunnerProperties.StubsMode.LOCAL
或 stubsMode = StubRunnerProperties.StubsMode.REMOTE
,则使用 Aether 实现。如果您提供了多个,则使用列表中的第一个。
Using the SCM Stub Downloader
每当 repositoryRoot
以 SCM 协议(当前,我们只支持 git://
)开头时,存根下载器都会尝试克隆储存库,并将其用作产生测试或存根的合约的源。
您可以通过环境变量、系统属性或在插件或合约储存库配置中设置的属性,修改下载器的行为。下表描述了可用的属性:
Type of a property |
Name of the property |
Description |
* |
master |
Which branch to checkout |
* |
Git clone username |
|
* |
Git clone password |
|
* |
10 |
将提交内容推送到 |
* |
1000 |
在尝试将提交推送到 |