1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ktor 2.0.0-beta-1 withTestApplicationのdeprecatedを解消する

Posted at

背景

現象

Ktor Project Generator にて、以下の条件でProjectを作成すると、
生成されたサンプルテストコードにて、deprecatedwithTestApplication()が含まれてしまっている。

- 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())
            }
        }
    }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?