Ktor Client에서 테스트하기
필수 의존성: io.ktor:ktor-client-mock
코드 예시: client-testing-mock
Ktor는 엔드포인트에 연결하지 않고 HTTP 호출을 시뮬레이션하는 MockEngine을 제공합니다.
의존성 추가
MockEngine
을 사용하기 전에, ktor-client-mock
아티팩트를 빌드 스크립트에 포함해야 합니다.
Kotlin
Groovy
XML
사용법
클라이언트 구성 공유
MockEngine
을 사용하여 클라이언트를 테스트하는 방법을 살펴보겠습니다. 클라이언트가 다음과 같은 구성을 가지고 있다고 가정해 봅시다:
이 클라이언트를 테스트하려면 해당 구성이 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.