【发布时间】:2019-01-03 00:51:03
【问题描述】:
我的视图模型中有一个MediatorLiveData,它应该对模型层的LiveData 发射做出反应,并在必要时采取行动并更新其侦听器。出于某种原因,源在测试期间不会更新。
class MyViewModel(private val repository: Repository) : ViewModel() {
private val liveData1: LiveData<String> = repository.getString1()
private val livedata2: LiveData<String> = repository.getString2()
val currentState = MediatorLiveData<MyState>
init {
currentState.addSource(liveData1) {
it?.let { string1 ->
doSomething()
currentState.postValue(String1Updated)
}
}
currentState.addSource(liveData2) {
it?.let { string1 ->
doSomethingElse()
currentState.postValue(String2Updated)
}
}
}
}
模拟观察者和存储库方法似乎没有帮助。 doSomething() 永远不会被调用,currentState 也不会更新为 String1Updated。
@RunWith(MockitoJUnitRunner::class)
class MyViewModelTest {
@get:Rule instantTaskExecutorRule = InstantTaskExecutorRule()
@Mock lateinit var mockRepository: Repository
@Mock lateinit var mockLiveData1: MutableLiveData<String>
@Mock lateinit var mockLiveData2: MutableLiveData<String>
@Mock lateinit var mockStateObserver: Observer<MyState>
lateinit var myViewModel: MyViewModel
@Before
fun setup() {
whenever(mockRepository.getLiveData1()).thenReturn(mockLiveData1)
whenever(mockRepository.getLiveData2()).thenReturn(mockLiveData2)
myViewModel = myViewModel(mockRepository)
}
@Test
fun `Does something when live data 1 is updated`() {
myViewModel.state.observeForever(mockStateObserver)
mockLiveData1.postValue("hello world")
verify(mockStateObserver).onChanged(String1Updated)
}
}
即使将观察者直接放置在mockLiveData1 和mockLiveData2 上以及中介者上的观察者也不会导致中介者中的源更新。
【问题讨论】:
-
mockLiveData1和mockLiveData2可能不应该是模拟。然后就可以了。
标签: android kotlin viewmodel android-livedata