协程单元测试:异常被吞没,测试通过

时间:2018-11-23 16:34:13

标签: unit-testing kotlin kotlinx.coroutines

我具有下一个测试功能:

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

我根据thisregisterUserasync包装了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时,处理程序中没有东西掉落……

为什么?

0 个答案:

没有答案