Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava测试“可观测重复”在测试中创建无限循环_Android_Unit Testing_Kotlin_Mockito_Rx Java - Fatal编程技术网

Android RxJava测试“可观测重复”在测试中创建无限循环

Android RxJava测试“可观测重复”在测试中创建无限循环,android,unit-testing,kotlin,mockito,rx-java,Android,Unit Testing,Kotlin,Mockito,Rx Java,我已将我的ViewModel设置为以这种方式无休止地重复API调用: useCase.fireAPICall(params) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .repeat() .delay(1, TimeUnit.SECONDS) .subscribe(::onSuccess, ::onFailed) 在我的单元测试中,我试图模拟API调用,并检查V

我已将我的
ViewModel
设置为以这种方式无休止地重复API调用:

useCase.fireAPICall(params)
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .repeat()
   .delay(1, TimeUnit.SECONDS)
   .subscribe(::onSuccess, ::onFailed)
在我的单元测试中,我试图模拟API调用,并检查
ViewModel
中的
LiveData
(在
::OnSuccess
方法中更新)是否相应更新

工作测试故障的单元测试:

val error = Throwable("")
// Arrange
Mockito.`when`(repo.apiCall(params))
   .thenReturn(Single.error(error))
// Act
viewModel.init()
// Verify
Mockito.verify(postDetailsViewStateObserver)
   .onChanged(Error(error))
**非工作:*f相反,我尝试使用以下命令模拟来自该API调用的有效响应:

// Arrange
Mockito.doReturn(Single.just(Success(result, list)))
   .`when`(repo).apiCall(params)
然后,
ViewModel
repeat()
会生成一个无休止的循环,它会阻止我的单元测试,而不会完成它


问题:我们如何通过检查观察到的第一件事情来测试
repeat()
情况?

您需要为
延迟提供一个调度程序,以利用测试时间,例如:

val testScheduler = TestScheduler()
RxJavaPlugins.setComputationSchedulerHandler { testScheduler }
在调用testScheduler.advanceTimeBy(1,TimeUnit.SECONDS)
之后,您将前进一秒钟。要使其正常工作,您可能还应该更改顺序,
delay
应该在
repeat
之前


您需要
setComputesSchedulerHandler
,因为默认情况下
delay
使用此计划程序。

您必须在测试中缩短序列。
重复
实际上是在
延迟
之后。那是一个糟糕的复制粘贴。谢谢你的回复,它成功了!