WireMock 定制
在本节中,我们将展示如何定制使用 WireMock 的方式。
注册您自己的 WireMock 扩展
WireMock 允许您注册自定义扩展。默认情况下,Spring Cloud Contract 注册了一个转换器,它允许您在响应中引用请求。如果您想提供自己的扩展,可以注册一个 org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions
接口的实现。由于我们使用 spring.factories
扩展方式,您可以在 META-INF/spring.factories
文件中创建类似于以下内容的条目:
org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions=\
org.springframework.cloud.contract.stubrunner.provider.wiremock.TestWireMockExtensions
org.springframework.cloud.contract.spec.ContractConverter=\
org.springframework.cloud.contract.stubrunner.TestCustomYamlContractConverter
以下示例展示了一个自定义扩展
import com.github.tomakehurst.wiremock.extension.Extension
/**
* Extension that registers the default transformer and the custom one
*/
class TestWireMockExtensions implements WireMockExtensions {
@Override
List<Extension> extensions() {
return [
new DefaultResponseTransformer(),
new CustomExtension()
]
}
}
class CustomExtension implements Extension {
@Override
String getName() {
return "foo-transformer"
}
}
如果您希望转换只应用于明确需要它的映射,请重写 applyGlobally() 方法并将其设置为 false 。 |
WireMock 配置定制
您可以注册一个 org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizer
类型的 bean 来定制 WireMock 配置(例如,添加自定义转换器)。以下示例展示了如何做到这一点:
@Bean
WireMockConfigurationCustomizer optionsCustomizer() {
return new WireMockConfigurationCustomizer() {
@Override
public void customize(WireMockConfiguration options) {
// perform your customization here
}
};
}
通过元数据定制 WireMock
从 3.0.0 版本开始,您可以在契约中设置 metadata
。如果您设置一个键等于 wiremock
的条目,并且其值是有效的 WireMock 的 StubMapping
JSON / map 或一个实际的 StubMapping
对象,Spring Cloud Contract 将使用您定制的一部分内容来修补生成的存根。我们来看下面的例子:
在 metadata
部分,我们设置了一个键为 wiremock
的条目,其值是一个 JSON StubMapping
,它在生成的存根中设置了延迟。这样的代码使我们能够得到以下合并的 WireMock JSON 存根。
{
"id" : "ebae49e2-a2a3-490c-a57f-ba28e26b81ea",
"request" : {
"url" : "/yamlfrauds",
"method" : "GET"
},
"response" : {
"status" : 200,
"body" : "{\"count\":200}",
"headers" : {
"Content-Type" : "application/json"
},
"fixedDelayMilliseconds" : 2000,
"transformers" : [ "response-template" ]
},
"uuid" : "ebae49e2-a2a3-490c-a57f-ba28e26b81ea"
}
当前的实现只允许操作存根端(我们不改变生成的测试)。此外,请求的整个内容、响应体和响应头不会被修改。
通过元数据和自定义处理器定制 WireMock
如果您想应用自定义的 WireMock StubMapping
后处理,您可以在 META-INF/spring.factories
文件中的 org.springframework.cloud.contract.verifier.converter.StubProcessor
键下注册您自己的存根处理器实现。为了方便起见,我们创建了一个名为 org.springframework.cloud.contract.verifier.wiremock.WireMockStubPostProcessor
的接口,专门用于 WireMock。
您需要实现一些方法来通知 Spring Cloud Contract 该后处理器是否适用于给定的契约以及后处理应该如何执行。
在消费者端,使用 Stub Runner 时,请记住传递自定义的 HttpServerStubConfigurer 实现(例如,扩展 WireMockHttpServerStubConfigurer 的实现),并在其中注册您选择的自定义扩展。如果您不这样做,即使您的 classpath 中有自定义的 WireMock 扩展,WireMock 也不会注意到它,不会应用它,并会打印出警告信息,表明未找到给定的扩展。 |