Skip to content

Ktor Clientでのテスト

必要な依存関係: io.ktor:ktor-client-mock

コード例: client-testing-mock

Ktorは、エンドポイントに接続することなくHTTPコールをシミュレートするMockEngineを提供します。

依存関係の追加

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)
    }
}

クライアントのテスト

クライアントをテストするには、リクエストパラメータをチェックし、必要なコンテンツ(この場合は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