gpt4 book ai didi

android - RxJava测试 `repeat`在可观察的情况下在测试上创建无穷循环

转载 作者:行者123 更新时间:2023-12-02 13:32:35 26 4
gpt4 key购买 nike

我已经设置了ViewModel以这种方式不断重复API调用:

useCase.fireAPICall(params)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.repeat()
.delay(1, TimeUnit.SECONDS)
.subscribe(::onSuccess, ::onFailed)

在我的单元测试中,我试图模拟API调用,并检查 LiveData(在 ViewModel方法中更新)内的 ::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()情况?

最佳答案

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

val testScheduler = TestScheduler()
RxJavaPlugins.setComputationSchedulerHandler { testScheduler }

然后调用 testScheduler.advanceTimeBy(1, TimeUnit.SECONDS),这样您将向前移动一秒钟。为了使其正常工作,您可能还应该更改顺序, delay应该在 repeat之前。

您需要 setComputationSchedulerHandler,因为 delay默认情况下使用此调度程序。

关于android - RxJava测试 `repeat`在可观察的情况下在测试上创建无穷循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60513561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com