我具有下一个测试功能:
@Test
fun `registerUser verify that loading was emitted`() {
runBlocking {
var emission = 0
val viewModel = createSubject()
viewModel.loading.observeForever {
if (emission == 0) {
assertNotNull(it)
assertFalse(it!!) //MARK #1
emission++
}
}
async { viewModel.registerCommand.registerUser("asd") }.await()
assertNotNull(viewModel.loading.value)
}
}
我根据this用registerUser
和async
包装了await
调用。
在registerUser
内部:
fun registerUser(username: String) {
launch {...
withContext(ConfigurableDispatchers.IO) {...}
...
}
}
具有此成员功能的类继承CoroutineScope
并用coroutineContext
覆盖ConfigurableDispatchers.Main + job
,而durint测试(在@BeforeClass
注释的方法中){{1 }}存有
ConfigurableDispatchers.Main
此外,object : MainCoroutineDispatcher() {
@ExperimentalCoroutinesApi
override val immediate: MainCoroutineDispatcher
get() = throw UnsupportedOperationException()
override fun dispatch(context: CoroutineContext, block: Runnable) {
block.run()
}
}
与ConfigurableDispatchers.IO
存根。
问题在于,从Dispatchers.Unconfined
引发的断言异常只是被打印在控制台中,而不是被吞没了。测试通过...
正如我所看到的和经过调试的-所有这些方法主体都在单个线程中执行,因此,如果在默认的MARK #1
处捕获了异常,那么据我所知,** test应该会失败* *。
有趣的是,当我用UncaughtExceptionHandler
块包装MARK #1
(失败的行),而我却抓到try catch
时,处理程序中没有东西掉落……
为什么?