首页 > 解决方案 > Android:使用 kotlin 协程的 ViewModel 测试不起作用

问题描述

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

我嘲笑了coroutineDispatcherProviderwith

@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()
    ...
}

我是不是在嘲笑某事或不做某事?提前致谢!

标签: androidkotlinkotlinx.coroutinesandroid-viewmodel

解决方案


TestCoroutineContext调度程序对于处理测试中的计时很有用,但您希望同步运行异步调用。您应该能够使用Unconfined调度程序来实现这一点。


推荐阅读