我希望正确测试一个 Ktor 应用程序,该应用程序使用 Koin,并且特别不使用嵌入式服务器方法来创建应用程序。我发现的所有解决方案要么已经过时,要么正在使用嵌入式服务器。这是我代码的简化版本:
Main.kt
fun main(args: Array<String>): Unit = EngineMain.main(args)
fun Application.koinModule() {
install(Koin) {
modules(myModule)
}
}
fun Application.doOtherStuff() {
val someSingleton by inject<SomeSingleton>()
(...)
}
应用程序.yaml:
ktor:
deployment:
port: 8080
application:
modules:
- MainKt.koinModule
- MainKt.doOtherStuff
我当前的解决方案确实有些工作,但感觉很黑客,并且在控制台中KoinNotStartedException
垃圾邮件:
Test.kt:
class MyTest : KoinTest {
@AfterEach
fun cleanup() {
stopKoin()
}
@Test
fun `mock koin module`() = testApplication {
startKoin {
modules(
myModule,
myMockModule, // override module with mocks
)
}
environment {
config = ApplicationConfig("application-test.yaml")
}
(...) // test code
}
}
application-test.yaml
ktor:
deployment:
port: 8080
application:
modules: # same as application.yaml, but without koin module
- MainKt.doOtherStuff
如果有一种有意的、更重要的是记录在案的用 Koin 测试 Ktor 的方法,请随时链接它。 谢谢!
我认为您的问题是您在已经期望 koin 上下文启动的 koin 内部testApplication {}
。为了取得成功,您应该对 junit4 使用KoinTestRule
或对 junit5 使用KoinTestExtension
。
class MyTest : KoinTest {
companion object {
@JvmField
@RegisterExtension
val koinTestExtension = KoinTestExtension.create {
modules(myModule, myMockModule)
}
}
@Test
fun `test`() = testApplication {
...
}
}
koin文档中的更多详细信息 https://insert-koin.io/docs/reference/koin-test/testing