Ktor / Kodein - 如何编写集成测试
Ktor / Kodein - How to write Integration Tests
目前我正在编写一个小型演示应用程序,它使用 Ktor 作为其应用程序环境,并使用 Kodein 作为依赖注入框架。
在应用程序初始化期间,我确实导入了一些模块,其中一个我想在集成测试初始化期间替换:
fun Application.module(testing: Boolean = false) {
logger.debug { "Starting main" }
restModule()
di {
bind<Json>() with singleton {
Json {
...
}
}
import(persistenceModule)
}
在测试中,我想使用不同的 persistenceModule,例如。一个内存模块。我的测试初始化如下:
fun start() {
val configPath = ClassLoader.getSystemResource("application-acceptanceTest.conf").file
engine = embeddedServer(CIO, commandLineEnvironment(arrayOf("-config=$configPath")))
engine.start()
val disposable = engine.environment.monitor.subscribe(ApplicationStarted) { application: Application ->
started = true
}
while (!started) {
Thread.sleep(10)
}
disposable.dispose()
}
我已经试过打电话
engine.application.di
但这让我(很明显)只能访问已经初始化的 Ktor 功能。这样的事情有可能吗?
Kodein-DI 允许您覆盖依赖项。关于以下接口:
interface Repository {
fun save()
fun find()
}
你可以有一个生产实现,包含在它自己的 DI 模块中:
class PersistenceRepository : Repository {
/* implementation */
}
val persistenceModule = DI.Module("persistenceModule") {
bind<Repository>() with singleton { PersistenceRepository() }
}
以及同一接口的测试实现:
class MemoryRepository : Repository {
/* implementation */
}
val memoryModule = DI.Module("memoryModule") {
bind<Repository>(overrides = true) with singleton { MemoryRepository() }
}
注意需要明确的 overrides
参数。
您可以将 DI 容器传递给您的 Ktor 函数:
val mainDI = DI {
import(persistenceModule)
}
fun Application.main(di: DI) {
di { extend(di) }
}
并在您的测试中扩展 mainDI
,以使用 memoryModule
:
覆盖正确的绑定
class ApplicationTest {
val testDI = DI {
extend(mainDI)
import(memoryModule, allowOverride = true)
}
@Test
fun myTest() {
withTestApplication({ main(testDI) })
// ...
}
}
目前我正在编写一个小型演示应用程序,它使用 Ktor 作为其应用程序环境,并使用 Kodein 作为依赖注入框架。
在应用程序初始化期间,我确实导入了一些模块,其中一个我想在集成测试初始化期间替换:
fun Application.module(testing: Boolean = false) {
logger.debug { "Starting main" }
restModule()
di {
bind<Json>() with singleton {
Json {
...
}
}
import(persistenceModule)
}
在测试中,我想使用不同的 persistenceModule,例如。一个内存模块。我的测试初始化如下:
fun start() {
val configPath = ClassLoader.getSystemResource("application-acceptanceTest.conf").file
engine = embeddedServer(CIO, commandLineEnvironment(arrayOf("-config=$configPath")))
engine.start()
val disposable = engine.environment.monitor.subscribe(ApplicationStarted) { application: Application ->
started = true
}
while (!started) {
Thread.sleep(10)
}
disposable.dispose()
}
我已经试过打电话
engine.application.di
但这让我(很明显)只能访问已经初始化的 Ktor 功能。这样的事情有可能吗?
Kodein-DI 允许您覆盖依赖项。关于以下接口:
interface Repository {
fun save()
fun find()
}
你可以有一个生产实现,包含在它自己的 DI 模块中:
class PersistenceRepository : Repository {
/* implementation */
}
val persistenceModule = DI.Module("persistenceModule") {
bind<Repository>() with singleton { PersistenceRepository() }
}
以及同一接口的测试实现:
class MemoryRepository : Repository {
/* implementation */
}
val memoryModule = DI.Module("memoryModule") {
bind<Repository>(overrides = true) with singleton { MemoryRepository() }
}
注意需要明确的 overrides
参数。
您可以将 DI 容器传递给您的 Ktor 函数:
val mainDI = DI {
import(persistenceModule)
}
fun Application.main(di: DI) {
di { extend(di) }
}
并在您的测试中扩展 mainDI
,以使用 memoryModule
:
class ApplicationTest {
val testDI = DI {
extend(mainDI)
import(memoryModule, allowOverride = true)
}
@Test
fun myTest() {
withTestApplication({ main(testDI) })
// ...
}
}