Ktor Client 테스트
필수 의존성: io.ktor:ktor-client-mock
코드 예제: client-testing-mock
Ktor는 엔드포인트에 연결하지 않고 HTTP 호출을 시뮬레이션하는 MockEngine을 제공합니다.
의존성 추가
MockEngine을 사용하기 전에, 빌드 스크립트에 ktor-client-mock 아티팩트를 포함해야 합니다.
Kotlin
Groovy
XML
사용법
클라이언트 설정 공유
MockEngine을 사용하여 클라이언트를 테스트하는 방법을 살펴보겠습니다. 클라이언트가 다음과 같이 설정되어 있다고 가정해 봅시다:
이 클라이언트를 테스트하려면, MockEngine을 사용하는 테스트 클라이언트와 설정을 공유해야 합니다. 설정을 공유하려면, 엔진을 생성자 매개변수로 받고 클라이언트 설정을 포함하는 클라이언트 래퍼(wrapper) 클래스를 생성하면 됩니다.
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를 초기화하고 필요한 어설션(assertions)을 수행할 수 있습니다.
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.
