(Kotlin 1.5.21,kotlinx-coroutines-test 1.5.0)
请考虑以下代码,它位于 androidx.lifecycle.ViewModel
中:
fun mayThrow(){
val handler = CoroutineExceptionHandler { _, t -> throw t }
vmScope.launch(dispatchers.IO + handler) {
val foo = bar() ?: throw IllegalStateException("oops")
withContext(dispatchers.Main) {
_someLiveData.value = foo
}
}
}
vmScope
对应于 viewModelScope
,在测试中它被替换为 TestCoroutineScope
。 dispatchers.IO
是 Dispatchers.IO
的代理,在测试中它是一个 TestCoroutineDispatcher
。在这种情况下,如果 bar()
返回 null,则应用程序的行为未定义,因此我希望在这种情况下它崩溃。现在我正在尝试(JUnit4)测试这段代码:
@Test(expected = IllegalStateException::class)
fun `should crash if something goes wrong with bar`() {
tested.mayThrow()
}
测试失败是因为它本应该测试的异常出现了。
Exception in thread "Test worker @coroutine#1" java.lang.IllegalStateException: oops
// stack trace
Expected exception: java.lang.IllegalStateException
java.lang.AssertionError: Expected exception: java.lang.IllegalStateException
// stack trace
我有一种感觉,好像我在这里漏掉了什么很明显的东西... 问题:我的ViewModel中的代码是否是从协程抛出异常的正确方式?如果是,如何对其进行单元测试?