okhhtp3 の Mockwebserver の使い方の問題ですが、
Mockwebserver 1回の enqueue(MockResponse response) メソッドの設定だけでは、
2回リクエストを実行すると2回目は応答しなくなる。
解決方法は2通り。
enqueue レスポンス設定をリクエストの回数分実行しておく
これはテストする HttpClient の実行回数に合わせてenqueue 実行を並べる。
MockWebServer server = new MockWebServer(); // 3回リクエストに対応 IntStream.rangeClosed(1, 3).boxed().forEach(i->{ server.enqueue(new MockResponse().addHeader("Content-Type", "application/json; " + "charset=utf-8") .setBody("{ \"status\":\"OK\", \"count\":" + i + " }").setResponseCode(200)); }); try{ server.start(); }catch(IOException e){ } // TODO HttpClient 実行テスト3回 // 終わったら server.shutdown(); を忘れずに。
Dispatcher を使う
okhttp3.mockwebserver.Dispatcher をインポートしてこの抽象クラスを
実装化して MockWebServer にディスパッチャーとして登録する。
これは、リクエストによって返却する MockResponse を変更できるのでリクエストのテストケースに
対応することが可能である。
MockWebServer server = new MockWebServer(); Dispatcher dispatcher = new Dispatcher() { @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { if (request.getPath().equals("/v1/login/auth/")){ return new MockResponse().addHeader("Content-Type", "application/json; " + "charset=utf-8") .setBody("{ \"auth status\":\"OK\" }").setResponseCode(200); }else if(request.getPath().equals("/v1/check/version/")){ return new MockResponse().addHeader("Content-Type", "application/json; " + "charset=utf-8") .setBody("{ \"check status\":\"OK\" }").setResponseCode(200); }else if(request.getPath().equals("/v1/profile/info/")){ return new MockResponse().addHeader("Content-Type", "application/json; " + "charset=utf-8") .setBody("{ \"info\":\"ABCD\" }").setResponseCode(200); } return new MockResponse().setResponseCode(404); } }; server.setDispatcher(dispatcher); try{ server.start(); }catch(IOException e){ } // TODO HttpClient 実行テスト // 終わったら server.shutdown(); を忘れずに。
リクエストが期待どおりでなければ、return new MockResponse().setResponseCode(404);
を実行している。
HttpClient にセットする MockwebServer に向けるために、
HttpClient のURLは以下で生成する String から作成するようにする。
String path = server.url("/v1/login/auth/").toString(); // これを、HttpRequest.newBuilder().uri メソッドに渡す URI 作成、URI.create(path) とする