【问题标题】:TestScheduler does not work (Kotlin + RxJava2 + mockito)TestScheduler 不起作用(Kotlin + RxJava2 + mockito)
【发布时间】:2017-11-30 14:51:29
【问题描述】:

我想编写一个单元测试来验证下面的callInit 方法。但是,我有空指针异常,该行包含subscribe(。我的问题是如何在下面的方法中验证 onnext 和 onerror 条件?

override fun callInit() {
    val requestInit = RequestInit(os = "android", osVersion = deviceUtil.osVersion(),
        appVersion = deviceUtil.apiVersion())
    compositeDisposable.add(
        interactor.getInit(requestInit)
            .subscribe(
                {
                  view.hideProgress()
                  this.commercialLink = it.commercialLink
                  view.updateScreen()
                },
                { error -> view.onError(error) }
            )
    )
}

测试方法:

 @Test
 fun should_update_commerciallink_AND_updateScreen_when_callInit() {
    val request = RequestInit("android", "version", "osversion")
    val responseInit = ResponseInit(false, false,
        "updatelink", "message", "useragreement", "commerciallink")

    whenever(deviceUtil.osVersion()).thenReturn("version")
    whenever(deviceUtil.apiVersion()).thenReturn("apiversion")
    whenever(interactor.getInit(request)).thenReturn(Observable.just(responseInit))

    presenter.callInit()

    testScheduler.triggerActions()
    verify(view).hideProgress()
    verify(view).updateScreen()
}

编辑

class SplashInteractor(private val initService: InitService,
    private val schedulerProvider: SchedulerProvider) : SplashContract.Interactor {

  override fun getInit(requestInit: SplashRequest.Init): Observable<SplashResponse.Init> {
    return initService.init(requestInit)
        .subscribeOn(schedulerProvider.io())
        .flatMap(funcErrorCheckAndTransform())
        .flatMap(funcVersionControl())
        .observeOn(schedulerProvider.ui())
  }

  override fun downloadCommercialVideo(commercialLink: String): Observable<File> {
    return initService.downloadCommercialLink(commercialLink)
        .subscribeOn(schedulerProvider.io())
        .flatMap(funcDownload(commercialLink))
        .observeOn(schedulerProvider.ui())
  }
}

演示者测试

  @Before
  fun setUp() {
    testScheduler = TestScheduler()
    interactor = SplashInteractor(initService, TestSchedulerProvider(testScheduler))

    presenter = SplashPresenter(contract, interactor, uriWrapper, compositeDisposable,
        cache, fileUtil, deviceUtil)
    spyPresenter = Mockito.spy(presenter)

  }

【问题讨论】:

  • 我认为问题出在最后一个whenever 语句中,因为它正在检查request 参数传递的条件。您应该只检查参数是否为RequestInit,类似于Mockito.isA(RequestInit.class) 作为参数。所以在java中它会是:when(interactor.getInit(isA(RequestInit.class))).thenReturn(Observable.just(responseInit))
  • 你能展示一下你是如何在测试中设置TestScheduler的吗?并查看您的代码并进行测试,您不需要它

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


【解决方案1】:

您在whenever 语句之一中有错字:

whenever(deviceUtil.apiVersion()).thenReturn("apiversion")

您已指示返回“apiversion”,但实际的 request 声明方式略有不同:

val request = RequestInit(..., ..., "osversion")

这两个字符串相等,因此 Mockito 无法返回您所期望的 Observable

"osversion" 更改为"apiversion"

【讨论】:

  • 它甚至没有接近,有一些不同的东西。据我了解,它不会模拟交互器类,上面我放了其他必要的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多