Источники MediatorLiveData не обновляются во время тестирования - PullRequest
0 голосов
/ 03 января 2019

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

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Как показано в моем посте, я использовал макет LiveData в качестве источника данных посредника.Это должны быть LiveData реализации.

@Before
fun setup() {
    liveData1 = MutableLiveData()
    whenever(mockRepository.getLiveData1()).thenReturn(liveData1)
    liveData1.postValue("initial value")
    myViewModel.state.observeForever(mockStateObserver)
}
0 голосов
/ 04 января 2019

mockLiveData1 и mockLiveData2, вероятно, не должны быть ложными.

Тогда это будет работать.

(Вы также можете попробовать @Spy, я всегда забываю, что это делает, хотя. Но я думаю, что вы должны просто создать их как обычные MutableLiveData вместо @Mock.)

0 голосов
/ 03 января 2019

MediatorLiveData должен иметь активного наблюдателя, чтобы активировать метод onChange.

Посмотрите на этот ответ .

...