在 Ktor Client 中測試
所需依賴: io.ktor:ktor-client-mock
程式碼範例: client-testing-mock
Ktor 提供一個 MockEngine,可以模擬 HTTP 呼叫而無需連接到端點。
新增依賴
在使用 MockEngine
之前,你需要包含 ktor-client-mock
artifact 在建構腳本中。
Kotlin
Groovy
XML
用法
共用 client 配置
讓我們看看如何使用 MockEngine
來測試 client。假設 client 有以下配置:
為了測試這個 client,它的配置需要與一個測試 client 共用,該測試 client 使用 MockEngine
。為了共用配置,你可以建立一個 client 包裝器類別,它接受一個引擎作為建構函數參數並包含 client 配置。
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
如下來建立一個 HTTP client,使用 CIO
引擎並發出請求。
kotlin
fun main() {
runBlocking {
val client = ApiClient(CIO.create())
val response = client.getIp()
println(response.ip)
}
}
測試 client
為了測試 client,你需要建立一個 MockEngine
實例,帶有一個處理器,該處理器可以檢查請求參數並回應所需的內容(在我們的例子中是一個 JSON 物件)。
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。