Ktor Client 中的测试
所需依赖项: io.ktor:ktor-client-mock
代码示例: client-testing-mock
Ktor 提供了 MockEngine,它模拟 HTTP 调用而无需连接到端点。
添加依赖项
在使用 MockEngine
之前,您需要将 ktor-client-mock
artifact 引入到构建脚本中。
Kotlin
Groovy
XML
用法
共享客户端配置
让我们看看如何使用 MockEngine
来测试客户端。假设客户端具有以下配置:
要测试此客户端,其配置需要与使用 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。