Как скрестить программу на Kotlin использующую корутины и фреймворк JUnit 5?
Суть проблемы
Возьмем простой класс. Метод bar содержит два вывода в консоль с паузой внутри корутины.
Напишем для него самый простейший тест.
При попытке запуска теста мы увидим, что вывелась надпись s1, а надпись s2 после задержки не вывелась.
В чем проблема?
Все просто. Код в блоке CoroutineScope исполняется "мгновенно", в фоне (примерно как при запуске обычного треда). Тест успевает закончится раньше, чем заканчивается действие задержки между двумя println.
Как решить проблему?
Немного модифицируем программу, добавляем Job
Потом модифицируем тест. Добавим ожидание окончания работы корутины job.join()
И вот результат, тест проходит как нужно.
Банально, но на этих граблях можно потерять очень много времени, греша на разные библиотеки, JDK, кривой компилятор и слишком сложный IDE. На самом деле все просто =)
Кстати, на тему работы с корутинами и JUnit в Kotlin есть неплохой материал