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

标签 android kotlin mockito retrofit kotlinx.coroutines

我正在使用 Kotlin 协程,特别是使用 Retrofit 的 CoroutineCallAdapterFactory。然后我正在尝试对一个类进行单元测试,该类又利用 Retrofit 接口(interface)(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 更好,因为它不会同时启动任何东西(否则您的测试时间可能会变得不稳定),并且可以让您更好地控制以什么顺序发生的事情。

例如,如果要无条件返回已完成的deferred,可以写成whenever(galwayBusService.getBusStops()).thenReturn(CompletableDeferred(busStopsResponse)) 或者

val deferred = CompletableDeferred<GetStopsResponse>()
whenever(galwayBusService.getBusStops()).thenReturn(deferred)
// Here you can complete deferred whenever you want

如果你想稍后完成它

关于android - 模拟返回 Kotlin Coroutines Deferred 类型的方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52692740/

相关文章:

java - 整数解析不适用于将二进制转换为十进制

android - "Canvas: trying to draw too large bitmap"当Android N Display Size 设置为大于Small 时

collections - 如何从 “chunked” block 构建列表?

java - 如何使用 Mockito 验证重载方法的调用次数?

java - Axon 夹具注入(inject)在 @CommandHandler 注解的方法中失败(构造函数除外)

java - Android 定时器的处理程序和可运行对象

android - PowerApps-将麦克风音频保存为可播放格式

kotlin - 访问 Kotlin 对象中的元素

android - Android 3.1 稳定版更新后的 Gradle Sync 问题 Kotlin

java - 如何在 Mockito 中验证通知