【问题标题】:Ktor embeddedServer not starting in TestsKtor EmbeddedServer 未在测试中启动
【发布时间】:2021-04-27 19:46:58
【问题描述】:

在我的 AcceptanceTests 中,我尝试使用以下非常粗鲁的代码来启动 Ktor EmbeddedServer,以便能够检查服务器是否已启动并且测试是否可以启动:

fun start() {
    val configPath = ClassLoader.getSystemResource("application-acceptanceTest.conf").file
    val appEnvironment = commandLineEnvironment(arrayOf("-config=$configPath"))

    engine = embeddedServer(CIO, appEnvironment)
    engine.addShutdownHook {
        stop()
    }

    engine.start()

    val disposable = engine.environment.monitor.subscribe(ApplicationStarted) {
        started = true
    }

    while (!started) {
        // the start method should not exit until server is started successfully
        Thread.sleep(10)
    }

    disposable.dispose()
}

不幸的是,这在通过 gradle 运行测试时不起作用,但在 IntelliJ 中的单个测试运行期间确实有效。任何提示表示赞赏。

我已经尝试添加一些日志语句,并且确实看到了 while 循环没有退出,因此我认为 ApplicationStarted-event 没有正确处理。

编辑:删除while循环时,测试使用gradle运行,但不在IntelliJ中:-(

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    所以,一切都与正确的顺序有关。它正在使用以下代码块:

    fun start() {
        val configPath = ClassLoader.getSystemResource("application-acceptanceTest.conf").file
        val appEnvironment = commandLineEnvironment(arrayOf("-config=$configPath"))
    
        engine = embeddedServer(CIO, appEnvironment)
        engine.addShutdownHook {
            stop()
        }
    
        val disposable = engine.environment.monitor.subscribe(ApplicationStarted) {
            started = true
        }
    
        engine.start()
    
        while (!started) {
            // the start method should not exit until server is started successfully
            Thread.sleep(10)
        }
    
        disposable.dispose()
    }
    

    我在这里学到的教训是在启动服务器之前先注册事件侦听器:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 2022-12-14
      • 1970-01-01
      • 2022-09-28
      • 2020-07-29
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多