Ktor embeddedServer не запускается в тестах

#kotlin #ktor

Вопрос:

В моих тестах на принятие я пытаюсь запустить встроенный сервер Ktor, используя следующий очень грубый код, чтобы иметь возможность проверить, запущен ли сервер и могут ли начаться тесты:

 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 обрабатывается неправильно.

ИЗМЕНИТЬ: при удалении цикла while тесты выполняются с помощью gradle, но не в IntelliJ 🙁

Ответ №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()
}
 

Мой урок, извлеченный здесь, состоит в том, чтобы сначала зарегистрировать прослушиватель событий перед запуском сервера: -)