MediatorLiveData在JUnit测试中不起作用?

时间:2018-12-24 07:23:29

标签: unit-testing junit android-livedata

因此,我尝试将MediatorLiveData用于通过使用libphonenumber将ISO国家/地区代码(例如“ US”)转换为国家/地区调用代码(例如“ +1”)的相当简单的用例。生成的屏幕工作正常,但即使使用InstantTaskExecutorRule,也似乎无法通过JUnit测试。

示例最小单元测试(在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
    }
}

1 个答案:

答案 0 :(得分:5)

感谢Reddit用户matejdro;答案是像薛定ding的猫一样,MediatorLiveData除非观察到,否则不会自我更新,因此我需要一个mediatedStr.observeForever{}来强制其自我更新。