2023/06/20 このエントリーをはてなブックマークに追加 はてなブックマーク - WireMockのモックサーバーをGraphQLサーバーとして使うときにツラくならないカスタムmatcherのご紹介

WireMockのモックサーバーをGraphQLサーバーとして使うときにツラくならないカスタムmatcherのご紹介

カテゴリ: , ,




Web APIのモックとかするやつです。
とあるリクエストを投げると、とあるレスポンスを返すなど設定できる。

https://wiremock.org


WireMockのツラミとしてmatcherが脆いというのがある。
意味的には等しいリクエストであっても、リクエストが完全一致とかしないと別ものと扱われてツラいなどあった。

GraphQLとかのクエリをhttp requestできるGraphQLサーバー的なものがあるとして

これもまた簡単に破綻する

        post(urlPathEqualTo("hoge/fuga"))
            .withQueryParam("piyo", matching(piyo))
            // 改行されてたりスペースが入ってたりすると簡単にmatchしなくなる
            .withRequestBody(equalToJson(Json.encodeToString("query { hoge { fuga } }")))
            .willReturn(
                aResponse()
                    .withStatus(200)
                    .withBody(responseJson)
                    .withHeader("Content-Type", "application/json; charset=utf-8")
            ).let(mock::register)
これが
query {
  hoge { fuga } 
}
だったり
query {
  hoge { fuga } }

だったとしてもmatchしてほしいが、文字列としての比較しかしてくれないとダメ〜〜!!!って言われちゃうという感じ。
4スペースとかタブとか、改行だとか、ちょっとしたフォーマットの差分で不一致になっちゃうのがなかなかストレスであった(なんか良い改善テクニックがあるかもだけど)。




そういったツラミから生まれた、このライブラリを使えばちゃんと意味的なmatchをしてくれるので幸せになれる。

https://github.com/nilwurtz/wiremock-graphql-extension

社内の人が作ったのだがいい感じ。
これはWireMockでGraphQLサーバーをモックしてる人にぜひ使ってみて欲しい。


ところで、このライブラリは、ローカルのWireMock専用のmatcherだった。
なのでリモートでも使えるようにした。

どういうことかというと、JUnit内とかでインメモリでWireMockを起動する場合ローカル起動でこの場合は動いていた。
しかしWireMockを同梱したDockerイメージなどを起動しておいてモックサーバーとして扱う、リモート起動の場合カスタムmactherの登録ができなかった。




こんなとこ



詳しくはREADMEに書いてある

https://github.com/nilwurtz/wiremock-graphql-extension#with-remote-wiremock-server



ということで GraphQLのクエリに改行が入ったりしていても、ちゃんと期待した mockレスポンスが返ってきて幸せになりましたとさ。

ちなみにこのライブラリは2023/6/20現在0.4.0ぽいので、使う際にはアーリーアダプターとしてぜひissue出したりPR投げたりすると喜ばれると思います!!!




0 件のコメント:

コメントを投稿

GA