#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()
}
Мой урок, извлеченный здесь, состоит в том, чтобы сначала зарегистрировать прослушиватель событий перед запуском сервера: -)