Closed5
OKHttpのレスポンスをモックする
テスト用ではなく、APIができていない時用。できる限り手軽にやりたい。
環境は下記
- 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"
}
}
APIの数もそこまで多くなかったので、OKHttpのInterceptorでmock responseを返すことにした。
OKHttp + Retrofit導入
dependencies {
...
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.okhttp3:okhttp:4.9.3"
}
モック用の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>"
}
}
あとはHilt
なり何なりでOkHttpClient
生成時にMockInterceptor
を渡すだけ。
ここもBuildConfigを見てaddInterceptor
するかどうかを判定したほうが良いかも
@Provides
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder().addInterceptor(MockInterceptor()).build()
}
このスクラップは2022/02/28にクローズされました