跳到主要内容

WireMock 自定义配置

DeepSeek V3 中英对照 WireMock Customization

在本节中,我们将展示如何自定义您使用 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"
}
}
important

如果你希望转换仅应用于明确要求它的映射,请重写 applyGlobally() 方法并将其设置为 false。

通过元数据自定义 WireMock​

从 3.0.0 版本开始,你可以在合约中设置 metadata。如果你设置了一个键为 wiremock 的条目,其值可以是有效的 WireMock StubMapping JSON / 映射或实际的 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 键下注册你自己的 stub 处理器实现。为了方便起见,我们创建了一个名为 org.springframework.cloud.contract.verifier.wiremock.WireMockStubPostProcessor 的接口,专门用于 WireMock。

你需要实现一些方法,来告知 Spring Cloud Contract 该后处理器是否适用于给定的合约,以及后处理应该如何进行。

important

在消费者端,使用 Stub Runner 时,请记住传递自定义的 HttpServerStubConfigurer 实现(例如扩展 WireMockHttpServerStubConfigurer 的那个),你将在其中注册你选择的自定义扩展。如果不这样做,即使你的类路径上有自定义的 WireMock 扩展,WireMock 也不会注意到它,不会应用它,并且会打印出一条警告信息,指出未找到给定的扩展。