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

以下示例展示了一个自定义扩展

TestWireMockExtensions.groovy
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

从版本 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 的实现),您将在其中注册您选择的自定义扩展。如果您不这样做,即使您的类路径上有自定义的 WireMock 扩展,WireMock 也不会注意到它,不会应用它,并且会打印出警告语句,指出未找到给定的扩展。
© . This site is unofficial and not affiliated with VMware.