请使用 spring-cloud-contract 5.0.2 获取最新稳定版本!spring-doc.cadn.net.cn

WireMock 自定义

在本节中,我们展示如何自定义您与 WireMock 交互的方式。spring-doc.cadn.net.cn

注册您自己的 WireMock 扩展

WireMock 允许您注册自定义扩展。默认情况下,Spring Cloud Contract 会注册转换器(transformer),该转换器可让您在响应中引用请求。如果您希望提供自己的扩展,可以注册一个实现 org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions 接口的类。
由于我们采用 spring.factories 扩展方式,您可以在 META-INF/spring.factories 文件中创建类似以下的条目:spring-doc.cadn.net.cn

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

以下示例显示了一个自定义扩展:spring-doc.cadn.net.cn

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 配置自定义

您可以注册一个类型为 org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizer 的 Bean,以自定义 WireMock 配置(例如,添加自定义转换器)。以下示例展示了如何实现此操作:spring-doc.cadn.net.cn

		@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 / 映射或实际的 StubMapping 对象,Spring Cloud Contract 将用您部分自定义的内容修补生成的存根。我们来看以下示例spring-doc.cadn.net.cn

metadata 部分中,我们设置了一个键为 wiremock 的条目,其值是一个 JSON StubMapping,用于在生成的存根中设置延迟。此类代码使我们能够获得如下合并后的 WireMock JSON 存根。spring-doc.cadn.net.cn

{
  "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"
}

当前实现仅允许操作存根端(我们不会更改生成的测试)。此外,未被更改的部分包括整个请求、响应体以及响应头。spring-doc.cadn.net.cn

通过元数据和自定义处理器对 WireMock 进行定制

如果您希望对自定义 WireMock StubMapping 后处理进行应用,您可以在 META-INF/spring.factories 下的 org.springframework.cloud.contract.verifier.converter.StubProcessor 键下注册您自己的桩处理器实现。为了方便起见,我们创建了一个名为 org.springframework.cloud.contract.verifier.wiremock.WireMockStubPostProcessor 的接口,该接口专门用于 WireMock。spring-doc.cadn.net.cn

您需要实现方法,以告知 Spring Cloud Contract 当前的后处理器是否适用于给定的契约,以及应如何进行后处理。spring-doc.cadn.net.cn

在消费者端,使用 Stub Runner 时,请记得将自定义的 HttpServerStubConfigurer 实现(例如,扩展了 WireMockHttpServerStubConfigurer 的那个)传递过去,在此处注册您所选择的自定义扩展。如果您不这样做,即使类路径中存在自定义的 WireMock 扩展,WireMock 也不会察觉到它、不会应用该扩展,并会打印出一条警告信息,指出所给的扩展未被找到。