单元测试CoroutineExceptionHandler

时间:2019-05-17 08:49:38

标签: android unit-testing kotlin coroutine kotlin-coroutines

你好,我有使用协程的这段代码,我想对其进行单元测试:

我的问题是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"))
    }
}

1 个答案:

答案 0 :(得分:1)

viewModelScope.launch(handler) {

在这里您将启动一个具有父项工作的协程。逃脱该异常的异常会传播到父作业中,这就是为什么此时无法将其描述为“未处理”的原因。

协程异常处理程序不是您的常规异常处理机制,它们只是最后的手段,可以观察代码应处理但不是由于错误引起的异常。

对于业务逻辑级别的错误处理,请使用自然机制try-catch。如果您有很多重复的错误处理逻辑,则始终可以编写一个inline fun(block: inline () -> Unit)来将块包装在这样的样板try-catch中。