【问题标题】:Ktor / Kodein - How to write Integration TestsKtor / Kodein - 如何编写集成测试
【发布时间】:2021-03-24 21:08:50
【问题描述】:

目前我正在编写一个小型演示应用程序,它使用 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 功能。有这样的可能吗?

【问题讨论】:

  • Application.module的定义中,可以访问属性developmentMode,如果是true,则导入内存模块而不是持久化模块。您可以在此处找到有关启用开发模式的信息ktor.io/docs/development-mode.html#enable

标签: kotlin ktor kodein


【解决方案1】:

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) })
        // ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2019-08-31
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多