MockWebServer POST に対応する

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){}