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
以下範例顯示了一個自訂擴充功能
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 也不會注意到它,不會應用它,並且會列印出找不到給定擴充功能的警告語句。 |