Mockito を触ってみた
0時に寝て4時に起きて6時に起きた。6時過ぎに slack でインフラ担当者から作業の報告があってその対応してた。
Mockito のモック作成⌗
Spring 5 WebClient のテストコードを書いてみた。Mockito というモックライブラリを使っているのをみかけたのでそれを使うことにした。当初は WebClient そのもののモックを用意して、どんなメソッドを呼び出しても Null オブジェクトのように無視すればいいんじゃないかと思ってたんだけど、Mockito はそういう用途に使うものではなく、それぞれのメソッドごとにモックを返すような設定ができる。次のような WebClient のメソッドチェーンでリクエストするようなモックを考える。
var response = this.client
.get()
.uri(uriBuilder -> uriBuilder
.path(path)
.queryParam("param", param)
.build())
.retrieve()
.bodyToMono(MyResponse.class)
.block();
他にもっとよいやり方があるかもしれないけど、私がよくわかってなくてこんなやり方しかできなかった。最終的には block()
を呼び出したときに任意のレスポンスを取得できればよいのだけど、メソッド単位にモックを呼び出していかないと型チェックやら実行時エラーやらで意図したようにテストできなかった。これだけをみたらメソッドチェーンのモック作りは面倒にみえる。Mockito がどうやってこれを実現しているのかわからないけど、すごい仕組みだなとは思った。
@MockBean
WebClient client;
@Mock
WebClient.RequestHeadersUriSpec requestHeadersUriSpec;
@Mock
WebClient.RequestHeadersSpec requestHeadersSpec;
@Mock
WebClient.ResponseSpec responseSpec;
@Mock
Mono<MyResponse> mono;
private void mockWebClientMethodChain(MyResponse response) {
Mockito.when(client.get()).thenReturn(requestHeadersUriSpec);
Mockito.when(requestHeadersUriSpec.uri((Function<UriBuilder, URI>) Mockito.any())).thenReturn(requestHeadersSpec);
Mockito.when(requestHeadersSpec.retrieve()).thenReturn(responseSpec);
Mockito.when(responseSpec.bodyToMono(MyResponse.class)).thenReturn(mono);
Mockito.when(mono.block()).thenReturn(response);
}
Read other posts