使用RxJava,Kotlin进行服务器轮询的单元测试

时间:2018-06-14 18:02:07

标签: android unit-testing kotlin mockito rx-java2

我尝试使用JUnit和Mockito为以下场景创建测试:调用服务器,如果响应不成功,请重试请求。

repository.uploadModel(model)
                .subscribeOn(schedulers.io())
                .observeOn(schedulers.ui())
                .repeatWhen (repeatTimer)
                .subscribe({
                    if (it.isSuccessful) {
                        mvpView?.showUploadComplete()
                    } else {
                        mvpView?.showGeneralUploadError()
                    }
                }, {
                     it.printStackTrace()
                })

到目前为止,我提出了这个问题:

val model = Mockito.mock(Model::class.java)
val errorResponse = Response.error<Any>(500, ResponseBody.create(null, ""))

whenever(repository.uploadModel(model))           
    .thenReturn(Flowable.just(errorResponse))

presenter?.uploadModel()
testScheduler?.triggerActions()

verify(view, atLeast(5)).pendingUpload()

实际发生的事情showGeneralUploadError()只被调用一次,然后测试结束并失败。 我想要发生什么:多次致电showGeneralUploadError()

额外信息:

  1. repeatTimer定义为单元测试的{ it: Flowable<Any> -> it.delay(0, TimeUnit.SECONDS)}
  2. repeatTimer被定义为生产的{ it: Flowable<Any> -> it.delay(5, TimeUnit.SECONDS)}
  3. 这只是演示问题的示例代码,而非实际代码

2 个答案:

答案 0 :(得分:2)

takeUntil()运算符只会响应通过onNext()发出的数据。由于您的测试永远不会发出数据值,因此无需执行任何操作。

从您的示例代码中不清楚您要完成的任务,因此我无法建议您可以采取哪些措施来解决此问题。

答案 1 :(得分:0)

问题发生在repeatTimer。我试图将其声明为嘲笑目的:

repeatTimer is defined as { it: Flowable<Any> -> it.delay(0, TimeUnit.SECONDS)}

但它应该只是

{ it: Flowable<Any> -> it}