使用 Koin(未嵌入)测试 Ktor 应用程序



我希望正确测试一个 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

相关内容

  • 没有找到相关文章

最新更新