Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

Как скрестить программу на Kotlin использующую корутины и фреймворк JUnit 5?

Суть проблемы

Возьмем простой класс. Метод bar содержит два вывода в консоль с паузой внутри корутины.

Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

Напишем для него самый простейший тест.

Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

При попытке запуска теста мы увидим, что вывелась надпись s1, а надпись s2 после задержки не вывелась.

Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

В чем проблема?

Все просто. Код в блоке CoroutineScope исполняется "мгновенно", в фоне (примерно как при запуске обычного треда). Тест успевает закончится раньше, чем заканчивается действие задержки между двумя println.

Как решить проблему?

Немного модифицируем программу, добавляем Job

Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

Потом модифицируем тест. Добавим ожидание окончания работы корутины job.join()

Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

И вот результат, тест проходит как нужно.

Как использовать корутины Kotlin совместно с JUnit 5 и не наступить на грабли

Банально, но на этих граблях можно потерять очень много времени, греша на разные библиотеки, JDK, кривой компилятор и слишком сложный IDE. На самом деле все просто =)

Кстати, на тему работы с корутинами и JUnit в Kotlin есть неплохой материал