如何对创建新协程的函数进行单元测试?
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% 确定,但在您的特定情况下,只需将 coVerify
和 assert
方法移动到 runBlocking
方法中即可:
@Test
fun `test doStuff`() {
runBlocking {
viewModel.doStuff()
coVerify { db.getFromDb() }
Assert.assertEquals(viewModel.result, 1)
}
}
我正在尝试为我的 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% 确定,但在您的特定情况下,只需将 coVerify
和 assert
方法移动到 runBlocking
方法中即可:
@Test
fun `test doStuff`() {
runBlocking {
viewModel.doStuff()
coVerify { db.getFromDb() }
Assert.assertEquals(viewModel.result, 1)
}
}