【问题标题】:Android: ViewModel test using kotlin coroutines not workingAndroid:使用 kotlin 协程的 ViewModel 测试不起作用
【发布时间】:2019-02-19 08:18:16
【问题描述】:

我是第一次使用协程,在 ViewModel 上测试我的工作时遇到了麻烦。 测试失败,

Wanted but not invoked:
observer.onChanged(<Capturing argument>);

测试如下:

val androidVersioningMock: Versioning.AndroidVersioning = mock {
    on { required } doAnswer { "3.3.6" }
}
val versioningMock: Versioning = mock {
    on { android } doAnswer { androidVersioningMock }
}
whenever(networkManager.getAppVersionAsync()).thenReturn(GlobalScope.async { versioningMock })
runBlocking {
    updateVersionModel =
        UpdateViewModel(application, coroutineDispatcherProvider).apply {
            updateLiveData.observeForever(stateObserver)
        }
    verify(stateObserver).onChanged(stateCaptor.capture())
    assertTrue(stateCaptor.lastValue is UpdateState.NoUpdate)
    assertEquals(UpdateState.NoUpdate, stateCaptor.lastValue)
}

我用

嘲笑了coroutineDispatcherProvider
@ExperimentalCoroutinesApi
override val coroutineDispatcherProvider = mock<CoroutineDispatcherProvider> {
    on { main } doAnswer { TestCoroutineContext() }
    on { io } doAnswer { TestCoroutineContext() }
}

在我的 ViewModel 中,失败的方法是

private suspend fun getUpdateVersion(): Versioning =
    withContext(coroutineDispatcherProvider.io) {
        networkManager.getAppVersionAsync().await()
    }

执行如下:

launch {
    val versioningModel = getUpdateVersion()
    ...
}

我不是在嘲弄什么,还是没有做某事?提前致谢!

【问题讨论】:

    标签: android kotlin kotlinx.coroutines android-viewmodel


    【解决方案1】:

    TestCoroutineContext 调度程序可用于处理测试中的计时,但您希望同步运行异步调用。您应该可以使用 Unconfined 调度程序实现此目的。

    【讨论】:

      【解决方案2】:

      我相信更好的方法是将调度程序传递给 viewModels,因此测试非常简单。 看到这个https://stackoverflow.com/a/62629410/2719243

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 2022-01-11
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多