我有一个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()
,并且当前状态不会更新为 String1Update。
@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
上,也不会导致调解员中的来源更新。
MediatorLiveData需要一个活跃的观察者才能触发其on "onChange"方法。
看看这个答案。
正如我的帖子中所展示的,我使用模拟LiveData
作为中介数据的来源。这些应该只是LiveData
实现。
@Before
fun setup() {
liveData1 = MutableLiveData()
whenever(mockRepository.getLiveData1()).thenReturn(liveData1)
liveData1.postValue("initial value")
myViewModel.state.observeForever(mockStateObserver)
}
mockLiveData1
和mockLiveData2
可能不应该被嘲笑。
然后它就会起作用。
(你也可以试试@Spy
,我总是忘记它的作用。但我认为您应该将它们实例化为常规的可变实时数据而不是@Mock
。