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
				}
			};
		}

透過 Metadata 自訂 WireMock

從 3.0.0 版本開始,您可以在合約中設定 metadata。如果您設定一個鍵等於 wiremock 的條目,並且該值將會是有效的 WireMock StubMapping JSON/map 或實際的 StubMapping 物件,Spring Cloud Contract 將使用您的自訂部分修補產生的 Stub。讓我們看一下以下範例

name: "should count all frauds"
request:
  method: GET
  url: /yamlfrauds
response:
  status: 200
  body:
    count: 200
  headers:
    Content-Type: application/json
metadata:
  wiremock:
    stubMapping: >
      {
        "response" : {
          "fixedDelayMilliseconds": 2000
        }
      }

metadata 區段中,我們設定了一個鍵為 wiremock 的條目,其值是一個 JSON StubMapping,用於設定產生 Stub 中的延遲。這樣的程式碼讓我們獲得了以下合併的 WireMock JSON Stub。

{
  "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 端(我們不會變更產生的測試)。此外,不會變更的是整個請求以及回應的主體和標頭。

透過 Metadata 和自訂處理器自訂 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 後處理器是否適用於給定的合約,以及後處理應如何進行。

在消費者端,當使用 Stub Runner 時,請記住傳遞自訂的 HttpServerStubConfigurer 實作(例如,擴充 WireMockHttpServerStubConfigurer 的實作),您將在其中註冊您選擇的自訂擴充功能。如果您不這樣做,即使您的類路徑上有自訂的 WireMock 擴充功能,WireMock 也不會注意到它,不會應用它,並且會列印出找不到給定擴充功能的警告語句。