我正在使用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
更好,因为它不会同时启动任何东西(否则您的测试时间可能会变得不稳定),并且可以更好地控制按什么顺序发生的事情。
例如,如果您要无条件返回已完成的延期付款,则可以将其写为whenever(galwayBusService. getBusStops()).thenReturn(CompletableDeferred(busStopsResponse))
。
val deferred = CompletableDeferred<GetStopsResponse>()
whenever(galwayBusService.getBusStops()).thenReturn(deferred)
// Here you can complete deferred whenever you want
如果您以后要完成