如何对创建新协程的函数进行单元测试?

How to unit test a function that creates a new coroutine?

我正在尝试为我的 ViewModel 编写单元测试。它包含几个在主体内部调用 viewModelScope.launch 的函数,例如我的示例 doStuff:

fun doStuff() {
    //synchronous stuff
    viewModelScope.launch (Dispatchers.Main) {
        doMoreStuff()
    }
}

suspend fun doMoreStuff() = withContext(Dispatchers.Main) {
    db.getFromDB()
    result = result + 1
}

我不确定如何测试它。这是我当前的测试:

    @Test
    fun `test doStuff`() {
        runBlocking {
            viewModel.doStuff()
        }
        coVerify { db.getFromDb() }
        Assert.assertEquals(viewModel.result, 1)
    }

我收到“java.lang.AssertionError:验证失败”,显示 getFromDb() 未被调用,并且 result 也未被设置。我也尝试删除 runBlocking.

一般来说,对于协程测试,有一种创建 CoroutineTestRule 的模式,它基本上会覆盖 Main Dispatcher,基本上你会 运行 中的所有内容一个线程处于阻塞模式。

我不是 100% 确定,但在您的特定情况下,只需将 coVerifyassert 方法移动到 runBlocking 方法中即可:

  @Test
    fun `test doStuff`() {
        runBlocking {
            viewModel.doStuff()
            coVerify { db.getFromDb() }
            Assert.assertEquals(viewModel.result, 1)
        }
    }

但我也会查看这个示例以进行协程测试:https://github.com/halcyonmobile/MultiplatformPlayground/blob/master/common/src/androidTest/kotlin/com/halcyonmobile/multiplatformplayground/viewmodel/ApplicationsViewModelTest.kt