首页 > 解决方案 > 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
    }
}

标签: unit-testingjunitandroid-livedata

解决方案


感谢 Reddit 用户matejdro;答案是,就像薛定谔的猫一样,MediatorLiveData 除非被观察到,否则不会自行更新,所以我需要 amediatedStr.observeForever{}来强制它自行更新。


推荐阅读