WireMockとは
Web APIのモックとかするやつです。
とあるリクエストを投げると、とあるレスポンスを返すなど設定できる。
WireMockはリクエストの比較がすぐに破綻する
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スペースとかタブとか、改行だとか、ちょっとしたフォーマットの差分で不一致になっちゃうのがなかなかストレスであった(なんか良い改善テクニックがあるかもだけど)。
GraphQLのクエリのカスタムmatcher
そういったツラミから生まれた、このライブラリを使えばちゃんと意味的なmatchをしてくれるので幸せになれる。
https://github.com/nilwurtz/wiremock-graphql-extension
社内の人が作ったのだがいい感じ。
これはWireMockでGraphQLサーバーをモックしてる人にぜひ使ってみて欲しい。
リモートで使えなかったので使えるようにした
ところで、このライブラリは、ローカルのWireMock専用のmatcherだった。
なのでリモートでも使えるようにした。
どういうことかというと、JUnit内とかでインメモリでWireMockを起動する場合ローカル起動でこの場合は動いていた。
しかしWireMockを同梱したDockerイメージなどを起動しておいてモックサーバーとして扱う、リモート起動の場合カスタムmactherの登録ができなかった。
なにをやったか
-
リモート対応できるようにライブラリの実装を変更しプルリク
- jarをつくる
- Dockerイメージ起動時に起動オプションでjarを読ませる。
こんなとこ
詳しくはREADMEに書いてある
https://github.com/nilwurtz/wiremock-graphql-extension#with-remote-wiremock-server
まとめ
ということで GraphQLのクエリに改行が入ったりしていても、ちゃんと期待した mockレスポンスが返ってきて幸せになりましたとさ。
ちなみにこのライブラリは2023/6/20現在0.4.0ぽいので、使う際にはアーリーアダプターとしてぜひissue出したりPR投げたりすると喜ばれると思います!!!
0 件のコメント:
コメントを投稿