android - 无法在单元测试中访问“Transformations.map”中的值
问题描述
为了给这个问题提供一些背景知识,我有一个 ViewModel 等待一些数据,将其发布到 MutableLiveData,然后通过一些属性公开所有值。这是一个简短的要点:
class QuestionViewModel {
private val state = MutableLiveData<QuestionState>()
private val currentQuestion: Question?
get() = (state.value as? QuestionState.Loaded)?.question
val questionTitle: String
get() = currentQuestion?.title.orEmpty()
...
}
然后,在我的测试中,我模拟数据并运行 assertEquals 检查:
assertEquals("TestTitle", viewModel.questionTitle)
到目前为止,所有这些工作都很好,但我实际上希望我的片段能够观察当前问题何时发生变化。所以,我试着改变它来使用Transformations.map
:
class QuestionViewModel {
private val state = MutableLiveData<QuestionState>()
private val currentQuestion: LiveData<Question> = Transformations.map(state) {
(it as? QuestionState.Loaded)?.question
}
val questionTitle: String
get() = currentQuestion.value?.title.orEmpty()
...
}
突然,我在测试课上的所有断言都失败了。我currentQuestion
公开并验证它的值在我的单元测试中为空。我确定这是问题所在,因为:
- 我可以模拟数据并仍然从我的
state
LiveData中获得正确的值 - 我可以运行我的应用程序并在屏幕上看到预期的数据,所以这个问题特定于我的单元测试。
我已经将其添加InstantTaskExecutorRule
到我的单元测试中,但也许这不能处理这些Transformations
方法?
解决方案
我最近遇到了同样的问题,我通过向 LiveData 添加一个模拟观察者来解决它:
@Mock
private lateinit var observer: Observer<Question>
init {
initMocks(this)
}
fun `test using mocked observer`() {
viewModel.currentQuestion.observeForever(observer)
// ***************** Access currentQuestion.value here *****************
viewModel.questionTitle.removeObserver(observer)
}
fun `test using empty observer`() {
viewModel.currentQuestion.observeForever {}
// ***************** Access currentQuestion.value here *****************
}
不确定它是如何工作的,或者在测试后不移除空观察者的后果。
此外,请确保导入正确的 Observer 类。如果您使用的是 AndroidX:
import androidx.lifecycle.Observer
推荐阅读
- arrays - Powershell - 与数组匹配
- c++ - 带工厂的类模板
- c - 我什么时候应该忽略关键部分,什么时候需要 nowait ?OpenMp
- ionic-framework - Ioic 与反应
- html - 输入类型时间占位符未显示在移动浏览器中
- python-3.x - 跨多个 EC 2 实例的关键部分
- jenkins - 如何使用 Jenkins 共享库收集构建历史
- regex - 正则表达式以特定字符开始和结束,然后排除字符串之间
- r - R - 根据前后值清理数据
- python - 未找到带有参数 '('',)' 的 'show-advertisement' 的反向操作。尝试了 1 种模式:['show_advertisement/(?P
[^/]+)$']