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 配置定製

您可以註冊一個 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 也不會注意到它,不會應用它,並會打印出警告資訊,表明未找到給定的擴充套件。