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