Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android LiveData的单元测试挂起功能失败,但流通过_Android_Unit Testing_Junit_Android Livedata_Kotlin Coroutines - Fatal编程技术网

Android LiveData的单元测试挂起功能失败,但流通过

Android LiveData的单元测试挂起功能失败,但流通过,android,unit-testing,junit,android-livedata,kotlin-coroutines,Android,Unit Testing,Junit,Android Livedata,Kotlin Coroutines,我试图为发出两个值的suspend函数编写单元测试,第一个值类似于加载,第二个值是实际数据。有一些不一致的地方,我不明白为什么会这样。为了简单起见,这里有一个小例子,它只发出几个数字(发出的类型应该无关紧要) TestCoroutineDispatcher用作Foo类的调度程序,MainCoroutineRule设置调度程序Main,重置它并调用cleanupTestCoroutines 运行这些测试时,test barFlowpass,test barLiveData失败,出现java.lan

我试图为发出两个值的suspend函数编写单元测试,第一个值类似于加载,第二个值是实际数据。有一些不一致的地方,我不明白为什么会这样。为了简单起见,这里有一个小例子,它只发出几个数字(发出的类型应该无关紧要)

TestCoroutineDispatcher用作Foo类的调度程序,MainCoroutineRule设置调度程序Main,重置它并调用cleanupTestCoroutines

运行这些测试时,
test barFlow
pass,
test barLiveData
失败,出现
java.lang.IllegalStateException:此作业尚未完成

如果
barLiveData
功能中至少有1毫秒的延迟,则
测试barLiveData
通过。测试
testbarflow
始终通过

我做错什么了吗?测试应该以不同的方式编写吗

多谢各位

编辑:建议的解决方案。 我仍然不明白,为什么会有不同的结果,但我有一个解决我的问题的办法。 当我使用observerForever时,我可以获得添加到LiveData的所有值

val values = mutableListOf<T>()
observeForever{
  values.add(it)
}
val values=mutableListOf()
观察者{
值。添加(it)
}
从该列表可以检查数据状态是否正确,顺序是否正确

我不确定单元测试中的ObserveForver是否存在问题。但在任何情况下,这里都有一些LiveData扩展函数,它可以删除observer

    fun <T> LiveData<T>.getAllValues(): List<T> {
        val values = mutableListOf<T>()
        val observer = object: Observer<T> {
            override fun onChanged(t: T) {
                values.add(t)
            }
        }
        this.observeForever(observer)
        removeObserver(observer)
        return values
    }
fun LiveData.getAllValues():列表{
val values=mutableListOf()
val observer=对象:observer{
更改后覆盖乐趣(t:t){
值。添加(t)
}
}
这是一个观察者(观察者)
removeObserver(观察员)
返回值
}
如果测试中的功能没有延迟,则此功能有效。如果生产代码正在测试中,我认为这应该不是问题

val values = mutableListOf<T>()
observeForever{
  values.add(it)
}
    fun <T> LiveData<T>.getAllValues(): List<T> {
        val values = mutableListOf<T>()
        val observer = object: Observer<T> {
            override fun onChanged(t: T) {
                values.add(t)
            }
        }
        this.observeForever(observer)
        removeObserver(observer)
        return values
    }