Ktor Clientでのテスト
必要な依存関係: io.ktor:ktor-client-mock
コード例: client-testing-mock
Ktorは、エンドポイントに接続することなくHTTPコールをシミュレートするMockEngineを提供します。
依存関係の追加
MockEngine
を使用する前に、ktor-client-mock
アーティファクトをビルドスクリプトに含める必要があります。
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)
}
}
クライアントのテスト
クライアントをテストするには、リクエストパラメータをチェックし、必要なコンテンツ(この場合はJSONオブジェクト)で応答できるハンドラを持つMockEngine
インスタンスを作成する必要があります。
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。