Найти в Дзене
Записки айтишника

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

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

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

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

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

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

-2

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

-3

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

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

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

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

-4

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

-5

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

-6

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

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