J'ai un MediatorLiveData
vivant dans mon viewmodel qui est censé réagir aux émissions de LiveData
de la couche de modèle, en prenant des mesures et en mettant à jour ses écouteurs si nécessaire. Pour une raison quelconque, les sources ne se mettent pas à jour pendant les tests.
@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) } }
Se moquer d'un observateur et des méthodes du référentiel ne semble pas aider. doSomething ()
n'est jamais appelé, et currentState n'est pas mis à jour en String1Updated.
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) } } } }
Même en plaçant des observateurs directement sur mockLiveData1
et mockLiveData2
en plus de l'observateur sur le médiateur ne provoque pas la mise à jour des sources dans le médiateur.
3 Réponses :
MediatorLiveData doit avoir un observateur actif pour qu'il déclenche sa méthode on "onChange".
Regardez cette réponse .
Désolé, j'ai laissé certains détails de mon message. Cerveau de fin de journée. Je vais le modifier maintenant.
Comme démontré dans mon article, j'utilisais des simulations de LiveData
comme sources pour les données du médiateur. Il ne doit s'agir que d'implémentations LiveData
.
@Before fun setup() { liveData1 = MutableLiveData() whenever(mockRepository.getLiveData1()).thenReturn(liveData1) liveData1.postValue("initial value") myViewModel.state.observeForever(mockStateObserver) }
mockLiveData1
et mockLiveData2
ne devraient probablement pas être des simulations.
Ensuite, cela fonctionnerait.
(Vous pouvez également essayer @Spy
, j'oublie toujours ce que cela fait. Mais je pense que vous devriez simplement les instancier en tant que MutableLiveData ordinaire au lieu de @Mock
.)
mockLiveData1
etmockLiveData2
ne devraient probablement pas être des simulations. Ensuite, cela fonctionnerait.