Skip to content

在 Ktor Client 中進行測試

所需的相依性io.ktor:ktor-client-mock

程式碼範例 client-testing-mock

Ktor 提供了一個 MockEngine,可以在不連接到端點的情況下模擬 HTTP 呼叫。

新增相依性

在正式使用 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)
    }
}

測試用戶端

要測試用戶端,您需要建立一個 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