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
從版本 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 的實現),您將在其中註冊您選擇的自定義擴充套件。如果您不這樣做,即使您的類路徑上有自定義的 WireMock 擴充套件,WireMock 也不會注意到它,不會應用它,並且會打印出警告語句,指出未找到給定的擴充套件。 |