kotlin - 无法为类 kotlinx.coroutines.Deferred 实例化代理
问题描述
我正在学习 Kotlin,我一直在参考 Venkat Subramaniam 的“Programming Kotlin”。在关于测试协程的章节中,提供了以下代码片段。
import kotlinx.coroutines.*
suspend fun getAirportStatus(airportCodes: List<String>): List<Airport> =
withContext(Dispatchers.IO) {
Airport.sort(
airportCodes.map { code -> async { Airport.getAirportData(code) } }
.map { response -> response.await() })
}
上面的单元测试是用 KotlinTest 和 Mockk 编写的,如下所示。
"getAirportStatus calls getAirportData asynchronously" {
mockkStatic("kotlinx.coroutines.BuildersKt__Builders_commonKt")
coEvery {
any<CoroutineScope>().async<Airport>(context = any(), block = captureCoroutine())
} answers {
CompletableDeferred(iad)
}
getAirportStatus(listOf("IAD")) shouldBe listOf(iad)
coVerify {
any<CoroutineScope>().async<Airport>(context = any(), block = any())
}
}
但是,当我运行测试时,出现以下错误。
Can't instantiate proxy for class kotlinx.coroutines.Deferred
io.mockk.MockKException: Can't instantiate proxy for class kotlinx.coroutines.Deferred
- 是什么导致错误?“无法实例化代理”实际上是什么意思?
- 本书前面提到过'suspend'方法调用必须在单元测试的协程上下文中完成,即在runBlocking{}中。getAirportStatus() 方法,一个挂起方法,怎么会在没有 runBlocking 的情况下被调用。“coEvery”在这方面有什么影响?
解决方案
推荐阅读
- angular - 使用 Angular 中的参数模拟激活的路由
- c++ - C++ 对象切片如何在内部工作?
- html - Angular ngForm中的Http POST请求错误
- python - 如何在 python 瓶中运行计时器功能?
- c# - ASP.Net MVC 项目的间歇性登录问题
- excel - VBA 未正确为单元格/范围赋值
- python-3.x - 模块“hmac”没有属性“新”
- swift - 为什么 DateFormatter 在 Swift 控制台上不起作用?
- mysql - 在为 mysql 版本 19.1 运行 oracle Goldengate 时收到警告--> !!! 警告 !!!--> libssl-2.17.0-stub.so
- r - 从前几行填充 NA,但添加一个级别