你好,我有使用协程的这段代码,我想对其进行单元测试:
我的问题是CoroutineExceptionHandler
从未捕获我的异常。
我的代码如下所示:
fun request() {
val handler = CoroutineExceptionHandler { _, throwable -> liveData.value = Resource.error(throwable.message) }
viewModelScope.launch(handler) {
liveData.value = Resource.loading()
val result = withContext(Dispatchers.IO) { useCase.request() }
liveFdDetails.value = Resource.success(result)
}
}
我的测试:
fun testError() = runBlocking {
//Given
val observer: Observer<Resource<Data>> = mock()
whenever(useCase.request()).thenThrow(Error("MSG"))
viewModel.liveData.observeForever(observer)
//When
viewModel.request()
//Then
inOrder(observer).apply {
verify(observer).onChanged(Resource.loading())
verify(observer).onChanged(Resource.error("MSG"))
}
}
答案 0 :(得分:1)
viewModelScope.launch(handler) {
在这里您将启动一个具有父项工作的协程。逃脱该异常的异常会传播到父作业中,这就是为什么此时无法将其描述为“未处理”的原因。
协程异常处理程序不是您的常规异常处理机制,它们只是最后的手段,可以观察代码应处理但不是由于错误引起的异常。
对于业务逻辑级别的错误处理,请使用自然机制try-catch
。如果您有很多重复的错误处理逻辑,则始终可以编写一个inline fun(block: inline () -> Unit)
来将块包装在这样的样板try-catch中。