首页 > 解决方案 > 无法为类 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
  1. 是什么导致错误?“无法实例化代理”实际上是什么意思?
  2. 本书前面提到过'suspend'方法调用必须在单元测试的协程上下文中完成,即在runBlocking{}中。getAirportStatus() 方法,一个挂起方法,怎么会在没有 runBlocking 的情况下被调用。“coEvery”在这方面有什么影响?

标签: kotlintestingcoroutinedeferredmockk

解决方案


推荐阅读