MockK를 이용한 Retrofit실패케이스 Call 생성하기

su_y2on·2023년 6월 25일
0

MockK를 이용한 Retrofit실패케이스 Call 생성하기


retrofit이 Response를 생성하기까지

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)}



0개의 댓글