HttpClient 実行を含むJUnit で、Mockwebserver を使う - Oboe吹きプログラマの黙示録
okhttp の Mockwebserver で、複数リクエストに対応する - Oboe吹きプログラマの黙示録
ここまでくると、次はPOST送信された内容に対するレスポンスの設定である。
okhttp3.mockwebserver.RecordedRequest から取得する BODY の InputStream を取り出せば良い。
getBody().inputStream() で取り出せる!
import okhttp3.mockwebserver.Dispatcher; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer;
MockWebServer server = new MockWebServer(); Dispatcher dispatcher = new Dispatcher(){ @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException{ try(InputStream inst = request.getBody().inputStream()){ ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = mapper.readValue(inst, new TypeReference<Map<String,Object>>(){}); // TODO 適切な MockResponse を返却させる }catch(StreamReadException e){ e.printStackTrace(); }catch(DatabindException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } return new MockResponse().setResponseCode(404); } }; server.setDispatcher(dispatcher); try{ server.start(); }catch(IOException e){}
なんか、こうなると以下のようにラムダ関数でまとめたくなりますね。
Function<RecordedRequest, MockResponse>
public static Dispatcher buildDispatcher(Function<RecordedRequest, MockResponse> function){ return new Dispatcher(){ @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException{ return function.apply(request); } }; }
すると、、、
MockWebServer server = new MockWebServer(); server.setDispatcher(buildDispatcher(request->{ try(InputStream inst = request.getBody().inputStream()){ ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = mapper.readValue(inst, new TypeReference<Map<String,Object>>(){}); // TODO 適切な MockResponse を返却させる }catch(StreamReadException e){ e.printStackTrace(); }catch(DatabindException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } return new MockResponse().setResponseCode(404); })); try{ server.start(); }catch(IOException e){}
でも、ObjectMapper での解析にException はつきものです。
なので、
public static Dispatcher buildDispatcher(Function<RecordedRequest, MockResponse> function , BiFunction<RecordedRequest, Exception, MockResponse> onCatch){ return new Dispatcher(){ @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException{ try{ return function.apply(request); }catch (Exception e){ return onCatch.apply(request, e); } } }; }
ここまですると、、
MockWebServer server = new MockWebServer(); server.setDispatcher(buildDispatcher(request->{ ObjectMapper mapper = new ObjectMapper(); try(InputStream inst = request.getBody().inputStream()){ Map<String, Object> map = mapper.readValue(inst, new TypeReference<Map<String,Object>>(){}); // TODO return new MockResponse().addHeader("Content-Type", "application/json; " + "charset=utf-8") .setBody("{ \"auth status\":\"OK\" }").setResponseCode(200); }catch(Exception ex){ throw new RuntimeException(ex); } }, (request, x)->{ return new MockResponse().setResponseCode(404); })); try{ server.start(); }catch(IOException e){}