Android:使用 kotlin 协程的 ViewModel 测试不起作用

Android: ViewModel test using kotlin coroutines not working

我是第一次使用协程,在 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()
    ...
}

我这不是在嘲笑什么,还是什么都没做?提前致谢!

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

我认为更好的方法是 将调度程序传递给 viewModels,因此测试非常简单.. 看到这个