模拟返回Kotlin Coroutines Deferred类型的方法的返回值

时间:2018-10-07 20:42:44

标签: android kotlin mockito retrofit kotlinx.coroutines

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

2 个答案:

答案 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 })

https://twitter.com/_rafaeltoledo处输入答案!