【问题标题】:MediatorLiveData sources don't update during testingMediatorLiveData 源在测试期间不更新
【发布时间】:2019-01-03 00:51:03
【问题描述】:

我的视图模型中有一个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 上以及中介者上的观察者也不会导致中介者中的源更新。

【问题讨论】:

  • mockLiveData1mockLiveData2 可能不应该是模拟。然后就可以了。

标签: android kotlin viewmodel android-livedata


【解决方案1】:

MediatorLiveData 需要有一个活动的 Observer 才能触发其 on“onChange”方法。

this answer

【讨论】:

  • 抱歉,我在帖子中遗漏了一些细节。一天结束的大脑。我现在就编辑它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    mockLiveData1mockLiveData2 可能不应该是模拟。

    然后就可以了。

    (你也可以试试@Spy,不过我总是忘记它的作用。但我认为你应该将它们实例化为常规的 MutableLiveData 而不是@Mock。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 2020-03-16
      • 2013-12-27
      相关资源
      最近更新 更多