1
votes

Les sources MediatorLiveData ne se mettent pas à jour pendant les tests

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.


1 commentaires

mockLiveData1 et mockLiveData2 ne devraient probablement pas être des simulations. Ensuite, cela fonctionnerait.


3 Réponses :


2
votes

MediatorLiveData doit avoir un observateur actif pour qu'il déclenche sa méthode on "onChange".

Regardez cette réponse .


1 commentaires

Désolé, j'ai laissé certains détails de mon message. Cerveau de fin de journée. Je vais le modifier maintenant.



2
votes

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)
}


0 commentaires

1
votes

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 .)


0 commentaires