Skip to content

Ktor Client에서 테스트하기

필수 의존성: io.ktor:ktor-client-mock

코드 예시: client-testing-mock

Ktor는 엔드포인트에 연결하지 않고 HTTP 호출을 시뮬레이션하는 MockEngine을 제공합니다.

의존성 추가

MockEngine을 사용하기 전에, ktor-client-mock 아티팩트를 빌드 스크립트에 포함해야 합니다.

Kotlin
Groovy
XML

사용법

클라이언트 구성 공유

MockEngine을 사용하여 클라이언트를 테스트하는 방법을 살펴보겠습니다. 클라이언트가 다음과 같은 구성을 가지고 있다고 가정해 봅시다:

  • 요청을 보내기 위해 CIO 엔진이 사용됩니다.
  • 들어오는 JSON 데이터를 역직렬화하기 위해 Json 플러그인이 설치되어 있습니다.

이 클라이언트를 테스트하려면 해당 구성이 MockEngine을 사용하는 테스트 클라이언트와 공유되어야 합니다. 구성을 공유하려면 생성자 매개변수로 엔진을 받아 클라이언트 구성을 포함하는 클라이언트 래퍼 클래스를 만들 수 있습니다.

kotlin
@Serializable
data class IpResponse(val ip: String)

class ApiClient(engine: HttpClientEngine) {
    private val httpClient = HttpClient(engine) {
        install(ContentNegotiation) {
            json()
        }
    }

    suspend fun getIp(): IpResponse = httpClient.get("https://api.ipify.org/?format=json").body()
}

그런 다음, 다음과 같이 ApiClient를 사용하여 CIO 엔진으로 HTTP 클라이언트를 생성하고 요청을 보낼 수 있습니다.

kotlin
fun main() {
    runBlocking {
        val client = ApiClient(CIO.create())
        val response = client.getIp()
        println(response.ip)
    }
}

클라이언트 테스트

클라이언트를 테스트하려면 요청 파라미터를 확인하고 필요한 콘텐츠(이 경우 JSON 객체)로 응답할 수 있는 핸들러를 사용하여 MockEngine 인스턴스를 생성해야 합니다.

kotlin
val mockEngine = MockEngine { request ->
    respond(
        content = ByteReadChannel("""{"ip":"127.0.0.1"}"""),
        status = HttpStatusCode.OK,
        headers = headersOf(HttpHeaders.ContentType, "application/json")
    )
}

그런 다음, 생성된 MockEngine을 전달하여 ApiClient를 초기화하고 필요한 어설션을 수행할 수 있습니다.

kotlin
class ApiClientTest {
    @Test
    fun sampleClientTest() {
        runBlocking {
            val mockEngine = MockEngine { request ->
                respond(
                    content = ByteReadChannel("""{"ip":"127.0.0.1"}"""),
                    status = HttpStatusCode.OK,
                    headers = headersOf(HttpHeaders.ContentType, "application/json")
                )
            }
            val apiClient = ApiClient(mockEngine)

            Assert.assertEquals("127.0.0.1", apiClient.getIp().ip)
        }
    }
}

전체 예시는 다음에서 찾을 수 있습니다: client-testing-mock.