背景
現象
Ktor Project Generator にて、以下の条件でProjectを作成すると、
生成されたサンプルテストコードにて、deprecated
なwithTestApplication()
が含まれてしまっている。
- Ktor version: 2.0.0-beta-1
- Engine: Netty
- Configuration in: Code
- Add sample code: チェックをつける
※ 2021/01/02時点。今後解消される可能性あり。
※ 2.0.0-beta-1 以前のバージョンでは試していないのですが、同様の現象が発生する可能性あり。
推測される原因
以下のPRで、新しいテストコードが実装されたが、Ktor Project Generatorが追いついていないためと考えられる。
(詳細がわかる方がいらっしゃいましたら、ご教示いただけますと幸いです。)
https://github.com/ktorio/ktor/pull/2689
https://youtrack.jetbrains.com/issue/KTOR-3236
解決案
修正前コード
デフォルトで生成されるAPIのテストコードはこんな感じ。
package com.example
import com.example.plugins.configureRouting
import io.ktor.http.*
import io.ktor.server.testing.*
import kotlin.test.Test
import kotlin.test.assertEquals
class ApplicationTest {
@Test
fun testRoot() {
withTestApplication({ configureRouting() }) {
handleRequest(HttpMethod.Get, "/").apply {
assertEquals(HttpStatusCode.OK, response.status())
assertEquals("Hello World!", response.content)
}
}
}
}
動きはするが、コードチェックにかけると、以下のようなWARNINGが出てしまう。
Warning:(12, 9) 'withTestApplication(Application.() -> Unit, TestApplicationEngine.() -> R): R' is deprecated. Please use new `testApplication` API
修正後コード
上記PRの差分を見ながら、以下のように書き換えたら、同様のテストができた。
(よりよい方法がありましたら、ご教示いただけますと幸いです。)
package com.example
import com.example.plugins.configureRouting
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import io.ktor.server.testing.*
import kotlin.test.Test
import kotlin.test.assertEquals
class ApplicationTest {
@Test
fun testRoot() {
testApplication {
application {
configureRouting()
}
val client = createClient { expectSuccess = false }
client.get("/").let {
assertEquals(HttpStatusCode.OK, it.status)
assertEquals("Hello World!", it.bodyAsText())
}
}
}
}