WireMock 定制

在本节中,我们将展示如何自定义使用 WireMock 的方式。spring-doc.cn

注册您自己的 WireMock 扩展

WireMock 允许您注册自定义扩展。默认情况下,Spring Cloud Contract 会注册 转换器,它允许您从响应中引用请求。如果您想 提供您自己的扩展,则可以注册接口的实现。 由于我们使用了 extension 方法,因此您可以创建一个类似于 文件中的以下内容:org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensionsspring.factoriesMETA-INF/spring.factoriesspring-doc.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.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 配置的自定义

您可以注册 类型的 bean 以自定义 WireMock 配置(例如,添加自定义转换器)。 以下示例显示了如何执行此操作:org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizerspring-doc.cn

		@Bean
		WireMockConfigurationCustomizer optionsCustomizer() {
			return new WireMockConfigurationCustomizer() {
				@Override
				public void customize(WireMockConfiguration options) {
// perform your customization here
				}
			};
		}

通过元数据自定义 WireMock

使用 3.0.0 版本,您可以在 Contract 中设置。如果设置的条目的 key 等于 to 且值 将是有效的 WireMock 的 JSON/map 或实际对象,Spring Cloud Contract 将修补生成的 stub 替换为您的自定义部分。让我们看看以下示例metadatawiremockStubMappingStubMappingspring-doc.cn

在该部分中,我们设置了一个带有 key 的条目,其值是一个 JSON,用于在生成的存根中设置延迟。这样的代码允许我们获取以下合并的 WireMock JSON 存根。metadatawiremockStubMappingspring-doc.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"
}

当前的实现只允许操作 stub 端(我们不会更改生成的测试)。另外,什么不会被改变 是响应的整个请求、正文和标头。spring-doc.cn

通过元数据和自定义处理器自定义 WireMock

如果要应用自定义 WireMock 后处理,可以在 key 下注册您自己的存根处理器实现。为方便起见,我们创建了一个专用于 WireMock 的接口。StubMappingMETA-INF/spring.factoriesorg.springframework.cloud.contract.verifier.converter.StubProcessororg.springframework.cloud.contract.verifier.wiremock.WireMockStubPostProcessorspring-doc.cn

您必须实现方法来通知 Spring Cloud Contract 后处理器是否适用于给定的 Contract 以及后处理应该是什么样子。spring-doc.cn

在使用者方面,使用 Stub Runner 时,请记住传递自定义实现(例如,扩展的那个),您将在其中注册您选择的自定义扩展。如果你不这样做,即使你在 classpath 上有一个自定义的 WireMock 扩展,WireMock 也不会注意到它,不会应用它,并且会打印出一个警告声明,指出没有找到给定的扩展。HttpServerStubConfigurerWireMockHttpServerStubConfigurer