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/ マップまたは実際の StubMapping オブジェクトになる場合、Spring Cloud Contract は生成されたスタブにカスタマイズの一部をパッチします。次の例を見てみましょう

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 です。このようなコードにより、次のマージされた 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 キーで独自のスタブプロセッサーの実装を登録できます。便宜上、WireMock 専用の org.springframework.cloud.contract.verifier.wiremock.WireMockStubPostProcessor というインターフェースを作成しました。

ポストプロセッサーが特定の契約に適用できるかどうか、およびポストプロセスがどのようになるべきかを Spring Cloud Contract に通知するメソッドを実装する必要があります。

コンシューマー側では、Stub Runner を使用する場合、選択したカスタム拡張機能を登録するカスタム HttpServerStubConfigurer 実装 (例: WireMockHttpServerStubConfigurer を継承する実装) を渡すことを忘れないでください。そうしないと、クラスパス上にカスタム WireMock 拡張機能があっても、WireMock はそれに気付かず、適用せず、指定された拡張機能が見つからなかったことを示す警告文を出力します。