1

我的项目使用干净的架构

我用:

  • 表示层的 MVP
  • 使用 RxAndroid 并获取 DisposableObservers 的用例
  • 用于 DI 的匕首 2

来自演示者(Kotlin)的示例代码:

fun doSomething() {

    getInterestingDataUseCase.execute(object : DisposableObserver<List<InterestingDataItem>>() {

        override fun onStart() {
            view.showLoadingIndicator()
        }

        override fun onNext(dataList: List<InterestingDataItem>) {
            view.showDataItems(dataList)
        }

        override fun onError(e: Throwable) {
            view.showErrorDialog()
        }

        override fun onComplete() {
            view.hideLoadingIndicator()
        }
    })
}

我想为这个演示者编写单元测试。

我的问题是: DisposableObserver 中的不同方法调用是否值得测试(onStart、onNext ...)?如果是的话,看起来我需要将 DisposableObserver 注入演示者(以便我能够模拟它)。有没有更清洁的方法?

4

1 回答 1

1

最终我得到了这个解决方案:

  • 使用Mockito模拟对象和响应(如此所述)
  • 使用Mockito Kotlin能够使用在 Kotlin 中使用时不显示编译时错误的 any() 方法
  • 在调用 UseCase 的 execute 方法时模拟 DisposableObserver 的行为

在请求完成时检查视图是否隐藏其进度指示器的测试示例:

@Test
fun stopsLoadingStateOnComplete() {

    //given
    given(getInterestingDataUseCase.execute(any())).
            will { invocation ->
                val observer = invocation.arguments[0] as DisposableObserver<List<InterestingDataItem>>
                observer.onComplete()
            }

    //when
    myPreseneter.onReady()

    //then
    then(view).should().hideLoadingIndicator()
}
于 2017-11-04T17:50:27.610 回答