コードのテストをしたり、APIがまだ未実装だったりで、モックが欲しかったのでそのメモ。
導入
Retrofit Mockを使う。
def retrofit_version = '2.7.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:retrofit-mock:$retrofit_version"
実装
サービスインタフェースを実装したモックを作成し、そこに返したいデータを書く。
Service.kt
interface Service {
@GET("api/v1/auth")
fun getAuth(@Query("id") id: String): Single<Auth>
@GET("api/v1/payment")
fun getPayment(@Query("token") token: String): Single<List<Payment>>
}
MockService.kt
class MockService(private val delegate: BehaviorDelegate<Service>) : Service {
override fun getAuth(id: String): Single<Auth> {
val auth = Auth("xxx")
return delegate.returningResponse(auth).getAuth(id)
}
override fun getPayment(token: String): Single<List<Payment>> {
val payment = Payment(1000)
return delegate.returningResponse(listOf(payment)).getPayment(token)
}
}
あとはAPI生成時にモックを返すようにすればOK。
Api.kt
class Api {
companion object {
fun create(): Service {
val retrofit = Retrofit.Builder()
.baseUrl("https://mock.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create())
.build()
val behavior = NetworkBehavior.create()
val mockRetrofit = MockRetrofit.Builder(retrofit)
.networkBehavior(behavior)
.build()
val delegate = mockRetrofit.create(Service::class.java)
return MockService(delegate)
}
}
}
補足
モック生成時にデフォルト値が設定されている項目があるので、随時変更すること。
val behavior = NetworkBehavior.create()
behavior.setDelay(100, TimeUnit.MILLISECONDS)
behavior.setVariancePercent(0)
behavior.setFailurePercent(0)
behavior.setErrorPercent(0)
項目 | 内容 | デフォルト値 |
---|---|---|
Delay | 発生する遅延 | 2000ms |
VariancePercent | 発生する遅延の割合 | ±40% |
FailurePercent | 発生する失敗の割合 | 3% |
ErrorPercent | 発生するエラーの割合 | 0% |