Android LiveData测试:如何跟踪值更改的顺序?

Android LiveData测试:如何跟踪值更改的顺序?,android,unit-testing,kotlin,android-livedata,Android,Unit Testing,Kotlin,Android Livedata,我通过测试学习LiveData。我想了解如何在测试中验证更改LiveData值的顺序。 我将这样的代码添加到被测试的类(TasksViewModel): 但是对getOrAwaitValue的第二次调用总是返回true,尽管它希望返回下一个LiveData值-false。 getOrAwaitValue功能代码: @VisibleForTesting (otherwise = VisibleForTesting.NONE) fun <T> LiveData <T> .ge

我通过测试学习LiveData。我想了解如何在测试中验证更改LiveData值的顺序。 我将这样的代码添加到被测试的类(TasksViewModel):

但是对
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 ()
            this@getOrAwaitValue.removeObserver (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
}
@VisibleForTesting(否则=VisibleForTesting.NONE)
有趣的LiveData.getOrAwaitValue(
时间:长=2,
timeUnit:timeUnit=timeUnit.SECONDS,
afterObserve:()->Unit={}
):T{
变量数据:T?=null
val闩锁=倒计时闩锁(1)
val observer=对象:observer{
更改后覆盖乐趣(o:T?){
数据=o
latch.countDown()
this@getOrAwaitValue.removeObserver(本)
}
}
这是ObserveForver(观察者)
试一试{
afterObserve.invoke()
//如果未设置LiveData,请不要无限期地等待。
如果(!lock.await(时间,时间单位)){
抛出TimeoutException(“从未设置LiveData值。”)
}
}最后{
this.removeObserver(观察者)
}
@抑制(“未选中的_CAST”)
将数据返回为T
}

这里怎么了?也许有另一种方法可以测试更改LiveData值的顺序?

您找到了解决这种情况的方法吗@安德烈·埃皮凡采夫
    tasksViewModel.someLongProcessing ()
    var processing = tasksViewModel.processing.getOrAwaitValue ()
    assertTrue(processing)
    processing = tasksViewModel.processing.getOrAwaitValue()
    assertFalse(processing)
@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 ()
            this@getOrAwaitValue.removeObserver (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
}