首页 > 解决方案 > 协程单元测试:异常被吞并测试通过

问题描述

我有下一个测试功能:

@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包装了调用。asyncawait

内部registerUser

fun registerUser(username: String) {
        launch {...
            withContext(ConfigurableDispatchers.IO) {...} 
            ...
        }
}

而具有此功能作为成员的类继承CoroutineScope并覆盖coroutineContextwith 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.IODispatchers.Unconfined.

问题是从中抛出的断言异常MARK #1只是在控制台中打印,而不是被吞没。测试通过......正如我所见和调试的那样 - 所有这些方法体都在一个线程中执行,所以如果在默认情况下捕获异常UncaughtExceptionHandler,那么,据我所知,**测试应该失败* *。还有什么有趣的,当我MARK #1用块包裹(失败的线)时try catch,而我正在捕捉Exception- 处理程序中没有任何东西掉落......

为什么?

标签: unit-testingkotlinkotlinx.coroutines

解决方案


推荐阅读