MediatorLiveData 在 JUnit 测试中不起作用?
MediatorLiveData doesn't work in JUnit tests?
所以我尝试将 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 不会自我更新,除非被观察到,所以我需要一个 mediatedStr.observeForever{}
来强制它自我更新。
所以我尝试将 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 不会自我更新,除非被观察到,所以我需要一个 mediatedStr.observeForever{}
来强制它自我更新。