У меня есть 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
в дополнение к наблюдателю на посреднике не приводит к тому, что источникиобновляться в посреднике.