MediatorLiveData源在测试期间不会更新

时间:2019-01-03 00:51:04

标签: android kotlin viewmodel android-livedata

我有一个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)
    }
}

除了将观察者直接放在mockLiveData1mockLiveData2上之外,也没有在调解器上放置观察者,也不会导致在调解器中更新源。

3 个答案:

答案 0 :(得分:1)

MediatorLiveData需要具有活动的Observer才能触发ononChange方法。

看看Trace的答案here

答案 1 :(得分:0)

如我的帖子中所示,我正在使用模拟LiveData作为中介数据的来源。这些应该只是LiveData的实现。

@Before
fun setup() {
    liveData1 = MutableLiveData()
    whenever(mockRepository.getLiveData1()).thenReturn(liveData1)
    liveData1.postValue("initial value")
    myViewModel.state.observeForever(mockStateObserver)
}

答案 2 :(得分:0)

mockLiveData1mockLiveData2可能不应该是模拟的。

然后它将起作用。

(您也可以尝试@Spy,尽管我总是忘记这样做是什么。但是我认为您应该将它们实例化为常规MutableLiveData而不是@Mock。)