HTTP(S)通信のテストに、OkHttpのMockWebServerを利用する

JavaのHTTPクライアントとして有名なOkHttpですが、関連プロジェクトにMockWebServerという機能があります。

HTTPサーバとしてモックを提供するものになります。手順としては、、

  • モックサーバとして返却するレスポンスのシナリオを書く
  • モックサーバを起動する
  • モックサーバのURLに対して、アプリケーションでアクセスする
  • レスポンスが予期したものであることを検証する

といった形になります。とてもシンプルで使いやすいです。

なお、OkHttpの関連プロジェクトですが、クライアントはOkHttpである必要性はありません。なので、様々なHTTPクライアントからの通信をテストすることができます。

使い方

MockWebServerのサイトのサンプルコードを元に説明します。

まずは、MockWebServerを生成し、モックサーバとして返却するレスポンスを定義します。

  MockWebServer server = new MockWebServer();

  server.enqueue(new MockResponse().setBody("hello, world!"));
  server.enqueue(new MockResponse().setBody("sup, bra?"));
  server.enqueue(new MockResponse().setBody("yo dog"));

モックサーバを起動し、モックサーバのURLを取得します。

  server.start();

  HttpUrl baseUrl = server.url("/v1/chat/");

アプリケーションを実行します。この際に、モックサーバのURLに対してアクセスさせるように指定します。

  Chat chat = new Chat(baseUrl);

  chat.loadMore();
  chat.loadMore();
  chat.loadMore();

モックサーバで受け付けたリクエストを検証します。server.takeRequest()で順番にリクエスト内容を取得できます。

  RecordedRequest request1 = server.takeRequest();
  assertEquals("/v1/chat/messages/", request1.getPath());
  assertNotNull(request1.getHeader("Authorization"));

  RecordedRequest request2 = server.takeRequest();
  assertEquals("/v1/chat/messages/2", request2.getPath());

  RecordedRequest request3 = server.takeRequest();
  assertEquals("/v1/chat/messages/3", request3.getPath());

最後にモックサーバを停止するのをお忘れなく。

server.shutdown();