unit-testing - 协程单元测试:异常被吞并测试通过
问题描述
我有下一个测试功能:
@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)
}
}
我已经使用并根据thisregisterUser
包装了调用。async
await
内部registerUser
:
fun registerUser(username: String) {
launch {...
withContext(ConfigurableDispatchers.IO) {...}
...
}
}
而具有此功能作为成员的类继承CoroutineScope
并覆盖coroutineContext
with ConfigurableDispatchers.Main + job
,而 durint 测试(在@BeforeClass
-annotated 方法中)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
只是在控制台中打印,而不是被吞没。测试通过......正如我所见和调试的那样 - 所有这些方法体都在一个线程中执行,所以如果在默认情况下捕获异常UncaughtExceptionHandler
,那么,据我所知,**测试应该失败* *。还有什么有趣的,当我MARK #1
用块包裹(失败的线)时try catch
,而我正在捕捉Exception
- 处理程序中没有任何东西掉落......
为什么?
解决方案
推荐阅读
- typescript - 将类型存储为字典键
- angular - 如何创建 Angular 4 组件以用于多个 Angular 4 项目?不是角 6
- postgresql - 无论“connect_timeout”如何,Postgresql WalReceiver 进程都会等待连接主机
- reactjs - 使用道具传播的 Thunk 问题加载 HOC
- node.js - 使用 ffmpeg 与 facebook rtmps 传输问题的 GoLive
- json - 如何将谷歌云视频智能结果的 json 文件获取到谷歌云存储桶中
- python-2.7 - 如果一个代理很好,那么如何只坚持该代理直到被禁止然后移动到另一个代理,在scrapy-proxy-rotation中?
- android - 回调和更新数据
- c++ - 将引用作为函数参数传递不起作用
- node.js - Node.js - 此代码运行时 Heroku 服务器崩溃