Closed5

OKHttpのレスポンスをモックする

Yuya MimuraYuya Mimura

環境は下記

  • Android Studio Bumblebee | 2021.1.1 Patch 1
  • kotlin: 1.6.10

まずモック用のbuildTypeを設定。

    buildTypes {
        getByName("debug") {
            applicationIdSuffix = ".debug"
        }
        getByName("release") {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        create("mock") {
            initWith(getByName("debug"))
            applicationIdSuffix = ".mock"
        }
    }
Yuya MimuraYuya Mimura

APIの数もそこまで多くなかったので、OKHttpのInterceptorでmock responseを返すことにした。
OKHttp + Retrofit導入

dependencies {
    ...
    implementation "com.squareup.retrofit2:retrofit:2.9.0"
    implementation "com.squareup.okhttp3:okhttp:4.9.3"
}
Yuya MimuraYuya Mimura

モック用のInterceptor。念のためbuildTypeを見てmock以外の場合はそのままAPIを通してレスポンスを返すようにしている

import com.example.app.BuildConfig
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.ResponseBody.Companion.toResponseBody

class MockInterceptor: Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        if (BuildConfig.BUILD_TYPE != "mock") {
            return chain.proceed(chain.request()).newBuilder().build()
        }

        val path = chain.request().url.toUri().path
        val mockedResponse = createMockedResponse(path)

        if (mockedResponse.isEmpty()) {
            return chain.proceed(chain.request()).newBuilder().build()
        }

        return Response.Builder()
            .code(200)
            .protocol(Protocol.HTTP_2)
            .message(mockedResponse)
            .body(
                mockedResponse
                    .toByteArray()
                    .toResponseBody(
                        "application/json"
                            .toMediaTypeOrNull()
                    )
            )
            .addHeader("content-type", "application/json")
            .request(chain.request())
            .build()
    }

    private fun createMockedResponse(path: String): String {
        // mock response作成
        return "<mocked response>"
    }
}
Yuya MimuraYuya Mimura

あとはHiltなり何なりでOkHttpClient生成時にMockInterceptorを渡すだけ。
ここもBuildConfigを見てaddInterceptorするかどうかを判定したほうが良いかも

    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder().addInterceptor(MockInterceptor()).build()
    }
このスクラップは2022/02/28にクローズされました