web-dev-qa-db-ja.com

Kotlinコルーチン遅延型を返すメソッドのモック戻り値

Kotlinコルーチンを使用しており、特にRetrofitのCoroutineCallAdapterFactoryを使用しています。次に、Retrofitインターフェイス(以下のGalwayBusService)を利用するクラスの単体テストを試みています。

_interface GalwayBusService {

    @GET("/routes/{route_id}.json")
    fun getStops(@Path("route_id") routeId: String) : Deferred<GetStopsResponse>

}
_

私のユニットテストでは、

val galwayBusService = mock()

次に、次のようなことを試して、そのメソッドが呼び出されたときに返されるものをモックします。問題は、getStopsDeferred値を返すことです。このようなAPIをモックするために推奨される特定のアプローチはありますか?

_`when`(galwayBusService.getBusStops()).thenReturn(busStopsResponse)
_
8
John O'Reilly

適切な解決策は、 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

後で完了したい場合

9
qwwdfsad

したがって、これを行う方法は、以下のようにasyncを使用することです。

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

答えは https://Twitter.com/_rafaeltoledo にクレジットしてください!

4
John O'Reilly