daisuzz.log

Spring FrameworkのMockRestServiceServerについて

今回は、クライアントサイドのクラスのモックテストを行うときに便利な、MockRestServiceServerについて書いていきます。

MockRestServiceServer とは

  • RestTemplateを利用して外部のサーバにHTTPリクエストを送信するクラス(Client-side)のテストを行いたい場合に使うクラス
  • 期待するリクエストとそのレスポンスのモックを指定することで、外部のサーバにHTTPリクエストを送らずに、テストをすることができる。

使い方

テストクラスのなかで、RestTemplateのインスタンスを用意し、RestTemplateをMockRestServiceServerにセットします。

RestTemplate restTemplate = new RestTemplate()
MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build();

次に、expect(), andExpect()で期待するリクエストを指定して、andRespond()で返すモックレスポンスを指定します。 その後、restTemplateで、指定したリクエストを叩くと内部でモックレスポンスを返します。

server.expect(requestTo("/hoge")).andExpect(method(HttpMethod.GET)).andRespond(withSuccess("hoge", MediaType.APPLICATION_JSON));

String response = restTemplate.getForObject("/hoge", String.class);

assertThat(response, is("hoge"));

server.verify();

↑の例では、restTemplateを直接呼び出してテストしていますが、内部でrestTemplateを呼び出すメソッドを叩いたときの挙動をモックテストすることもできます。

server.expect(requestTo("/hoge")).andExpect(method(HttpMethod.GET)).andRespond(withSuccess("fuga", MediaType.APPLICATION_JSON));

SampleController controller =  new SampleController(restTemplate);
String response = controller.getHoge("/hoge", String.class);

assertThat(response, is("hoge"));

server.verify();

メリット

  • restTemplateを利用するメソッドをモック化するのではなく、restTemplateの内部をモック化するので、実際にrestTemplateのメソッドを呼ぶところまでテストすることができます。
  • どのリクエストのときにどのレスポンスを返すのかという指定のコードがMockitoを用いたモックテストよりも読みやすいものになります(個人的な印象です)。

おわりに

今回は、RestTemplateを利用したモックテストで便利なMockRestServiceServerの使い方とメリットを書きました。 自分の中でまだまだ知らないクラスがあるので、すこしづつですが便利なものを紹介できたらなと思います。

参考資料

MockRestServiceServer (Spring Framework 5.2.8.RELEASE API)

SpringのRestTemplateを使うコンポーネントのJUnitテストはこう書く!! - Qiita