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)
_
適切な解決策は、 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
後で完了したい場合
したがって、これを行う方法は、以下のようにasync
を使用することです。
whenever(galwayBusService. getBusStops()).thenReturn(async { busStopsResponse })
答えは https://Twitter.com/_rafaeltoledo にクレジットしてください!