Android LiveData的单元测试挂起功能失败,但流通过
我试图为发出两个值的suspend函数编写单元测试,第一个值类似于加载,第二个值是实际数据。有一些不一致的地方,我不明白为什么会这样。为了简单起见,这里有一个小例子,它只发出几个数字(发出的类型应该无关紧要) TestCoroutineDispatcher用作Foo类的调度程序,MainCoroutineRule设置调度程序Main,重置它并调用cleanupTestCoroutines 运行这些测试时,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
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
}