我有一个这样的课程
class SomeClass {
fun someFun() {
// ... Some synchronous code
async {
suspendfun()
}
}
private suspend fun suspendFun() {
dependency.otherFun().await()
// ... other code
}
}
我想进行单元测试someFun()
,所以我编写了一个单元测试,如下所示:
@Test
fun testSomeFun() {
runBlocking {
someClass.someFun()
}
// ... verifies & asserts
}
但这似乎不起作用,因为runBlocking实际上并不阻止执行,直到runBlocking内的所有内容都完成。如果我直接在suspendFun()
内测试runBlocking
,它会按预期工作,但我希望能够一起测试someFun()
。
有关如何使用同步和异步代码测试函数的任何线索?
答案 0 :(得分:11)
执行后,someFun()
只会“触发并忘记”async
结果。因此,runBlocking
在该测试中没有任何区别。
如果可能,请someFun()
返回async
的{{1}},然后在Deferred
中,点击runBlocking
。
await
然后测试:
fun someFun(): Deferred<Unit> {
// ... Some synchronous code
return async {
suspendFun()
}
}
此question/answer是获取更多信息的良好资源。
也可以避免runBlocking {
SomeClass().someFun().await()
}
支持使用async
函数和suspend
- 创建的协程:
launch
测试使用suspend fun someFun() {
// ... Some synchronous code
suspendFun()
}
private suspend fun suspendFun() {
delay(1000)
println("executed")
// ... other code
}
,外部launch
隐式等待其完成:
runBlocking