Есть ли способ дождаться приостановки функции, которая выполняется в области, например, что делает runBlocking для запуска функций приостановки?
Например,
class CoroutineTestCase : CoroutineScope {
val job = Job()
var value = 1
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Unconfined
fun testFunction() {
async {
delay(2000)
value = 2
}
}
}
@Test
fun testCoroutine() = runBlocking {
val coroutineTestCase = CoroutineTestCase()
coroutineTestCase.testFunction()
assertEquals(2, coroutineTestCase.value)
}
Вышеприведенный тест завершается неудачно со значением 1 и не изменяется (так как launch
не ожидался до конца). Если бы testFunction
была приостановленной функцией, и я запустил ее с помощью runBlocking внутри моего модульного теста, все бы сработало.
Я пробовал с другими пользовательскими диспетчерами (такими как тот, что ниже), которые могут блокировать выполнение своих задач, но не повезло
class TestUiContext : CoroutineDispatcher() {
override fun dispatch(context: CoroutineContext, block: Runnable) {
block.run()
}
}