Тестирование 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?