debugする時に追加している記述の備忘録(3)

はじめに

前回までの記事

テスト用に通信鯖をandroid内部に立てたい(2)

画像等のバイナリを返すレスポンス

  • MockResponse::setBody(okio.Buffer body)

の関数で、okio.Buffer は OutputStreamと同じイメージで置き換え出来るので、レスポンスはそのまま返却できる

あとはaddHeaderで適切なContent-Typeを返却してやるだけ

  • app/debug/java/DebugHogeApplication.java
public class DebugHogeApplication extends HogeApplication {
    private MockWebServer server;

    //〜中略〜
    // 詳細は debugする時に追加している記述の備忘録(2) 参照

    private void initServer(){
        server = new MockWebServer();

        Dispatcher dispatcher = new Dispatcher() {

            @Override
            public MockResponse dispatch(final RecordedRequest request) throws InterruptedException {
                if (request == null || request.getPath() == null) {
                    return new MockResponse().setResponseCode(400);
                }
                
                MockResponse res = new MockResponse()
                                        .addHeader("Content-Type", "application/json") 
                                        .addHeader("charset", "utf-8") 
                                        .setResponseCode(200);

                MockResponse resB = new MockResponse()
                                        .addHeader("Content-Type", "image/png") 
                                        .setResponseCode(200);

                String path = request.getPath();

                switch(path){
                    case RestUtil.BASE_MAIN_URL + "/hoge":
                        return res.setBody(readJson("hoge.json"));
                    case RestUtil.BASE_MAIN_URL + "/fuga":
                        return res.setBody(readJson("fuga.json"));
                    case RestUtil.BASE_MAIN_URL + "/maiu": //★ 今回追加
                        return resB.setBody(readJson("sample.png"));
                        break;
                    default:
                        return new MockResponse().setResponseCode(404);
                }

            }
        };

        server.setDispatcher(dispatcher);

        try{
            server.start();
            RestUtil.BASE_SCHEME = RestUtil.SCHEME_HTTP;
            RestUtil.BASE_HOST = server.getHostName();
            RestUtil.BASE_PORT = server.getPort();
        }catch(Exception ex){
            shutdown();
            server = null;     
        }
    }

    private Buffer readBinary(String filename){
        InputStream is = null;
        BufferedInputStream br = null;
        Buffer buffer = new Buffer();    
        
        try {
            AssetManager as = getApplicationContext().getResources().getAssets();   
            is = as.open(filename);  
            br = new BufferedInputStream(is);
        
            byte[] data = new byte[1024];
            int count = 0;
            while ((count = br.read(data)) != -1) {
                      buffer.write(data, 0, count);
            }
            buffer.flush();
        } catch (Exception e) {
            return buffer;
        } finally {
            if (is != null){
                        try {
                                is.close();
                        } catch (IOException e) {
                        }
                    }
                    if (br != null){
                    try {
                                br.close();
                        } catch (IOException e) {
                        }
                    }
            }   
        return buffer;
    }

考えてみたら

switchだと後ろにパラメータ付けた時引っかかりませんね(苦笑

サンプルそのまま使うほうが確かに悪いんだろうな・・・

ベキ論から言うと正規表現

private void initServer(){
        server = new MockWebServer();

        Dispatcher dispatcher = new Dispatcher() {

            @Override
            public MockResponse dispatch(final RecordedRequest request) throws InterruptedException {
                if (request == null || request.getPath() == null) {
                    return new MockResponse().setResponseCode(400);
                }
                
                MockResponse res = new MockResponse()
                                        .addHeader("Content-Type", "application/json") 
                                        .addHeader("charset", "utf-8") 
                                        .setResponseCode(200);
                String path = request.getPath();

                //★=== 修正箇所 ====
                if(path.indexOf("/hoge") != -1){
                     return res.setBody(readJson("hoge.json"));
                }
                if(path.indexOf("/fuga") != -1){
                     return res.setBody(readJson("fuga.json"));
                }
                if(path.indexOf("/maiu") != -1){
                    MockResponse resB = new MockResponse()
                                        .addHeader("Content-Type", "image/png") 
                                        .setResponseCode(200);
                     return resB.setBody(readBinary("sample.png"));
                }
                return new MockResponse().setResponseCode(404);
            }
        };

        server.setDispatcher(dispatcher);

        try{
            server.start();
            RestUtil.BASE_SCHEME = RestUtil.SCHEME_HTTP;
            RestUtil.BASE_HOST = server.getHostName();
            RestUtil.BASE_PORT = server.getPort();
        }catch(Exception ex){
            shutdown();
            server = null;     
        }
    }

参考

osa030.hatenablog.com

公式のgithubwiki だと okhttpのjavadocしかないのでなにげに探した。。

非公式なjavadocしかないのかな?

皆さん直にコード見てるんだろうか・・