我正在使用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

如果您以后要完成

10-08 17:54