Тестирование LiveData: как отследить последовательность изменений значения?

Изучаю тестирование LiveData по официальным урокам. Хочу понять, как можно проверить в тесте последовательность изменения значения LiveData. Я добавил такой код в тестируемый класс(TasksViewModel):

val processing = MutableLiveData<Boolean>(false)

fun someLongProcessing() {
    processing.value = true
    viewModelScope.launch(Dispatchers.IO) {
        sleep(10000)
        processing.value = false
    }
}

Я хочу в тесте проверить, что processing сперва принимает значение false, а затем true. Я добавил такой код в тесте:

    tasksViewModel.someLongProcessing()
    var processing = tasksViewModel.processing.getOrAwaitValue()
    assertThat(processing, `is`(true))
    processing = tasksViewModel.processing.getOrAwaitValue()
    assertThat(processing, `is`(false))

Но второй вызов getOrAwaitValue почему-то всегда возвращает true, хотя вроде бы должен возвращать следущюее значение LiveData - false. Код функции getOrAwaitValue:

@VisibleForTesting(otherwise = VisibleForTesting.NONE)
fun <T> LiveData<T>.getOrAwaitValue(
        time: Long = 2,
        timeUnit: TimeUnit = TimeUnit.SECONDS,
        afterObserve: () -> Unit = {}
): T {
    var data: T? = null
    val latch = CountDownLatch(1)
    val observer = object : Observer<T> {
        override fun onChanged(o: T?) {
            data = o
            latch.countDown()
            [email protected](this)
        }
    }
    this.observeForever(observer)

    try {
        afterObserve.invoke()

        // Don't wait indefinitely if the LiveData is not set.
        if (!latch.await(time, timeUnit)) {
            throw TimeoutException("LiveData value was never set.")
        }

    } finally {
        this.removeObserver(observer)
    }

    @Suppress("UNCHECKED_CAST")
    return data as T
}

Что здесь не так? Может быть есть какой-то другой способ протестировать последовательность изменения значений LiveData?


Ответы (0 шт):