首页 > 解决方案 > 无法在单元测试中访问“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公开并验证它的值在我的单元测试中为空。我确定这是问题所在,因为:

我已经将其添加InstantTaskExecutorRule到我的单元测试中,但也许这不能处理这些Transformations方法?

标签: androidkotlinandroid-architecture-componentsandroid-livedata

解决方案


我最近遇到了同样的问题,我通过向 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

推荐阅读