Ложное возвращаемое значение метода, который возвращает Kotlin Coroutines Deferred type - PullRequest
0 голосов
/ 07 октября 2018

Я использую Kotlin Coroutines и, в частности, использую Retrofit's 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 голосов
/ 09 октября 2018

Правильным решением является использование 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

, если вы хотите завершить его позже

0 голосов
/ 08 октября 2018

Итак, получается, что способ сделать это - использовать async, как показано ниже:

whenever(galwayBusService. getBusStops()).thenReturn(async { busStopsResponse })

Кредит от https://twitter.com/_rafaeltoledo для ответа!

...