WireMock clientのKotlin DSLを作ってみたお話です。
導入
Maven
<dependency> <groupId>io.github.siosio</groupId> <artifactId>wiremockk</artifactId> <version>1.0.0</version> </dependency>
Gradle
implementation 'io.github.siosio:wiremockk:1.0.0'
使い方
Stubの登録
WireMockに追加された拡張関数のregister
を使ってStubを登録できるようになっています。
register
には、request
に指定したパターンにマッチした場合に返すものをresponse
に指定して登録します。
基本の形
この例の場合、以下が完全にマッチした場合に、指定のレスポンスが返ります。
- method
- url
import io.github.siosio.wiremockk.register val wireMock = WireMock(container.getMappedPort(8080)) wireMock.register { request { method = RequestMethod.GET url = "/test" } response { status = 200 headers { contentType("application/json") } body { // classpath配下のファイルの内容がレスポンスとして返されます。 path("data/test.json") } } }
クエリパラメータのパターン登録
クエリーパラメータのパターンは、request
ブロックのurl
ブロックに指定します。
この例の場合には、クエリーパラメータのkey
はa
とb
がありq
にはv
が含まれている場合に、指定のレスポンスが返されるようになります。
request { method = RequestMethod.GET url("/test") { // valueに文字列を指定した場合は、WireMock.equalToと同じ意味になります queryParam("key", "a") queryParam("key", "b") queryParam("q", WireMock.containing("v")) } }
リクエストボティのパターン登録
body
のjson
やxml
を使って、リクエストボディがマッチしたときにレスポンスを返すStubを定義できます。
jsonPath
を使うことでclasspath配下のファイルの内容とマッチさせることもできます。
任意のパターンを使ってマッチさせたい場合には、pattern
を使います。
import io.github.siosio.wiremockk.register val wireMock = WireMock(container.getMappedPort(8080)) wireMock.register { request { method = RequestMethod.POST url = "/users" body { // language=json json( """ { "user": { "name": "siosio" } } """.trimIndent(), false, true) } } response { status = 201 headers { header("location", "users/1") } } }
リクエストの検証
WireMockに追加された拡張関数のverify
を使って検証ができるようになっています。
検証例
基本的な使い方は、register
のrequest
ブロックの指定と同じになっています。
wireMock.verify { url = "/test" method = RequestMethod.POST headers { header("Content-Type", "application/json") } body { json("""{"test":"value"}""") } }