Android LiveData测试:如何跟踪值更改的顺序?
我通过测试学习LiveData。我想了解如何在测试中验证更改LiveData值的顺序。 我将这样的代码添加到被测试的类(TasksViewModel): 但是对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
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
}