我正在使用 Kotlin 协程,特别是使用 Retrofit 的 CoroutineCallAdapterFactory
。然后我正在尝试对一个类进行单元测试,该类又利用 Retrofit 接口(interface)(GalwayBusService
下面)。
interface GalwayBusService {
@GET("/routes/{route_id}.json")
fun getStops(@Path("route_id") routeId: String) : Deferred<GetStopsResponse>
}
在我的单元测试中我有
val galwayBusService = mock()
然后尝试类似以下的方法来模拟调用该方法时返回的内容。问题在于 getStops
返回一个 Deferred
值。有没有什么特别的方法可以用来模拟这样的 API?
`when`(galwayBusService.getBusStops()).thenReturn(busStopsResponse)
最佳答案
正确的解决方案是使用 CompletableDeferred
.
它比编写 async
更好,因为它不会同时启动任何东西(否则您的测试时间可能会变得不稳定),并且可以让您更好地控制以什么顺序发生的事情。
例如,如果要无条件返回已完成的deferred,可以写成whenever(galwayBusService.getBusStops()).thenReturn(CompletableDeferred(busStopsResponse))
或者
val deferred = CompletableDeferred<GetStopsResponse>()
whenever(galwayBusService.getBusStops()).thenReturn(deferred)
// Here you can complete deferred whenever you want
如果你想稍后完成它
关于android - 模拟返回 Kotlin Coroutines Deferred 类型的方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52692740/