MockK를 이용한 Retrofit실패케이스 Call 생성하기
Retrofit으로 얻은 Call<>
의 결과를 .awitResponse()
를 호출할때 Response
로 반환하는 과정이 진행되는데
성공시에 http의 호출결과인 rawResponse가 body에 담겨서 생성되고
실패시에는 errorBody에 들어가서 생성된다.
따라서 실패시 body가 null이기 때문에 따로 처리로직을 짜놓았다
data class GetUserNameResponse(
val userName: String?,
)
retrofitClient.getUserName(userId)
.awaitResponse()
.body() ?: GetUserNameResponse(null)
이제 제대로 동작하는지 확인하기 위해 단위테스트를 작성하려다보니 Retrofit이 실패한 Response를 뱉도록 stub을 해야했고 mocking을 할 필요가 생겼다.
나는 retrofitClient.getUserName(userId)까지를 stub해주기로했고 Call를 mocking해야해서 찾다가 retrofit2.mock.Calls
를 이용하기로 했다.
build.gradle
에 추가해주고
testImplementation("com.squareup.retrofit2:retrofit-mock")
이제 Calls를 이용해서 stub을 하고 body에 null이 들어오는 상황을 테스트해보자. coroutine으로 짜서 그에 맞게 test를 작성했다.
val json = "application/json".toMediaType()
val responseBody = "{\"statusCode\": \"400\", \"statusMessage\":\"invalid value\"}".toResponseBody(json)
coEvery { retrofitClient.getUserName(any()) }
.returns(Calls.response(Response.error(400, responseBody)))
val userName = retrofitClient.getUserName(userId).userName()
await().untilAsserted {assertThat(userName).isEqualTo(null)}