Skip to content

在 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 有以下配置:

  • CIO 引擎 用於發出請求。
  • 已安裝 Json 外掛以反序列化傳入的 JSON 資料。

為了測試這個 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