unit-testing - MediatorLiveData 在 JUnit 测试中不起作用?
问题描述
因此,我尝试将 MediatorLiveData 用于通过使用 libphonenumber 将 ISO 国家代码(例如“US”)转换为国家呼叫代码(例如“+1”)的相当简单的用例。生成的屏幕工作正常,但似乎无法通过 JUnit 测试,即使使用 InstantTaskExecutorRule 也是如此。
我认为应该通过但失败的示例最小单元测试(在 Kotlin 中):
import android.arch.core.executor.testing.InstantTaskExecutorRule
import android.arch.lifecycle.MediatorLiveData
import android.arch.lifecycle.MutableLiveData
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
class MediatorLiveData_metaTest {
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
@Test
fun mediatorLiveData_metaTest() {
val sourceInt = MutableLiveData<Int>()
val mediatedStr = MediatorLiveData<String>()
mediatedStr.addSource(sourceInt) {
mediatedStr.value = it.toString()
}
sourceInt.value = 123
assertEquals("123", mediatedStr.value) // says mediatedStr.value is null
}
}
解决方案
感谢 Reddit 用户matejdro;答案是,就像薛定谔的猫一样,MediatorLiveData 除非被观察到,否则不会自行更新,所以我需要 amediatedStr.observeForever{}
来强制它自行更新。
推荐阅读
- arrays - 无法将元素从数组传递到视图
- haskell - Haskell:将整数推送到堆栈实现时的无限列表
- docker - 如何从 docker 获取报告文件并插入到 gitlab 存储库
- node.js - 我的nodejs api混合了客户端同时api请求的代码
- .htaccess - 如何使用 htaccess 重定向带有版本和 SEO 友好 URL 的强制 https?
- react-native - 反应原生触控 ID
- python - csv阅读器引号和行分隔
- python - 使用多列的 Redshift where 子句
- python-3.x - Python:在 WHILE 循环中嵌套 IF:使用 exit() 还是让 WHILE“正常”完成?
- python-3.x - Python3 telnetlib ConnectionRefusedError:[Errno 111] 连接被拒绝错误