我有一个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
上之外,也没有在调解器上放置观察者,也不会导致在调解器中更新源。
答案 0 :(得分:1)
答案 1 :(得分:0)
如我的帖子中所示,我正在使用模拟LiveData
作为中介数据的来源。这些应该只是LiveData
的实现。
@Before
fun setup() {
liveData1 = MutableLiveData()
whenever(mockRepository.getLiveData1()).thenReturn(liveData1)
liveData1.postValue("initial value")
myViewModel.state.observeForever(mockStateObserver)
}
答案 2 :(得分:0)
mockLiveData1
和mockLiveData2
可能不应该是模拟的。
然后它将起作用。
(您也可以尝试@Spy
,尽管我总是忘记这样做是什么。但是我认为您应该将它们实例化为常规MutableLiveData而不是@Mock
。)