しおしお

IntelliJ IDEAのことなんかを書いてます

WireMock clientのKotlin DSLを作ってみた

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ブロックに指定します。 この例の場合には、クエリーパラメータのkeyabがありqにはvが含まれている場合に、指定のレスポンスが返されるようになります。

request {
    method = RequestMethod.GET
    url("/test") {
        // valueに文字列を指定した場合は、WireMock.equalToと同じ意味になります
        queryParam("key", "a")
        queryParam("key", "b")
        queryParam("q", WireMock.containing("v"))
    }
}

リクエストボティのパターン登録

bodyjsonxmlを使って、リクエストボディがマッチしたときにレスポンスを返す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を使って検証ができるようになっています。

検証例

基本的な使い方は、registerrequestブロックの指定と同じになっています。

wireMock.verify {
    url = "/test"
    method = RequestMethod.POST
    headers {
        header("Content-Type", "application/json")
    }
    body {
        json("""{"test":"value"}""")
    }
}