我正在使用Kotlin协程,尤其是使用Retrofit的CoroutineCallAdapterFactory
。然后,我正在尝试对一个类进行单元测试,而该类又利用了Retrofit接口(下面的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)
答案 0 :(得分:7)
正确的解决方案是使用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
如果您想稍后完成
答案 1 :(得分:4)
因此,事实证明,这样做的方法是使用async
,如下所示:
whenever(galwayBusService. getBusStops()).thenReturn(async { busStopsResponse })