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,因此测试非常简单..
看到这个
我是第一次使用协程,在 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,因此测试非常简单.. 看到这个