我正在使用Mockito编写测试代码。
我正在使用RxJava和Retrofit从服务器获取资源。

mockRestService.get(id)方法返回Observable。
首先,请求调用返回状态为“未就绪”的项目。
因此,我应该使用Rx运算符“repeatWhen()”。
重试后,服务器将发送状态为“完成”的项目。

以下是我的演示者代码。

val getItem = restService.getItem(id)
                .repeatWhen { it.delay(1000, TimeUnit.MILLISECONDS) }
                .takeUntil { it.status == "complete" }

下面是我的测试代码。
为了模仿服务器行为,我在测试代码下面编写了代码。
@Test
fun printJobTest_one_job_normal_case() {

    val notReadyItem = Item(status = "not ready")
    val completeItem = Item(status = "complete")

    Mockito.`when`(mockRestService.getItem(id))
        .thenReturn(Observable.just(notReadyItem)) // First 2 response is "not ready" status
        .thenReturn(Observable.just(notReadyItem))
        .thenReturn(Observable.just(completeItem)) // Third response is "complete" status

    // verify
}

为了模仿服务器行为,我使用了链接的“thenReturn()”方法。
但是,只会始终显示状态为“未就绪”的项目。

最佳答案

我...找到了解决方案。
这很简单...
下面的代码工作正常。

@Test
fun printJobTest_one_job_normal_case() {

    val notReadyItem = Item(status = "not ready")
    val completeItem = Item(status = "complete")

    Mockito.`when`(mockRestService.getItem(id))
        .thenReturn(Observable.just(notReadyItem, notReadyItem, completeItem))

    // verify
}

我只是删除了链接方法“thenReturn”,并将变量移至Observable的参数。

09-08 02:21