読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

Web サーバーのモック

Java

雨が降るか降らないか微妙なところでどんよりしててあんま外に出る気が起きない。。。

おかげで作業が捗るわー(´・_・`)(せっかくの3連休だし出かけたい。。。


今回もテストの話で、モックを使ってみた。

HTTPクライアントとか作っててそのクラスのテストをしたい時に、中でリモートのWebサーバーとかにアクセスしてるけど、テストではアクセスしたくないな〜

って思ってWebサーバーのモックを作ってみた。

モック用のライブラリっていろいろあるみたいだけど、個人的に使いやすかった mockwebser っていうのを使った

github.com

jar はここにあった(公開してるのかよく分からないけど。。)

まだあんまり使い方よく分かってないんだけどね〜こんな感じにした

モックサーバーの立て方
@Before
protected void setUp() throws Exception {
  MockWebServer server = new MockWebServer();

  final Dispatcher dispatcher = new Dispatcher() {
    @Override
    public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
      // 以下にリクエストのパスで場合分けしてステータスコードとかレスポンスボディを設定する
      if (request.getPath().equals("/hoge")) {
        return new MockResponse().setResponseCode(200).setBody("{\"hoge\":\"fuga\"}"); // Web サーバーのレスポンスが JSON なら JSON文字列をセット
      } else {
        return new MockResponse().setResponseCode(404);
      }
    }
  };
  server.setDispatcher(dispatcher);

  server.start();
  ...
}
  1. サーバーを作成 (MockWebServer server = new MockWebServer();)
  2. 挙動設定 (final Dispatcher dispatcher = new Dispatcher() { ... })
  3. サーバーを起動 (server.start();)

の流れかな。挙動設定は他にもいろいろあるっぽいから github の方を見た方がいいかも

モックサーバーの使い方

自分で作ったHTTPクライアントの中でモックサーバーにアクセスしてもらうようにするためには、クライアントの中で設定しているホスト名とかポート番号とかを変更しないといけない

クライアント使用時に引数としてURLを渡してる場合なら、

HTTPClient httpClient = new HTTPClient();
httpClient.sendRequest(server.url("/hoge").toString());

フィールドとしてホスト名やポート番号があって、それをWebサーバーにアクセスする時に使ってる場合なら、

HTTPClient httpClient = new HTTPClient();
httpClient = new HTTPClient();
Class<? extends HTTPClient> c = httpClient.getClass();
Field f;
f = c.getDeclaredField("port");
f.setAccessible(true);
f.set(httpClient, String.valueOf(server.getPort()));

f = c.getDeclaredField("host");
f.setAccessible(true);
f.set(httpClient, server.getHostName());

httpClient.sendRequest();

とかで変えれるかな