【问题标题】:RxJava2 JUnit testingRxJava2 JUnit 测试
【发布时间】:2016-12-20 21:17:36
【问题描述】:

我在对 RxJava 代码部分进行单元测试时遇到了一些麻烦。我想测试下面的方法。这是一个presenter方法。

public void onSearchQueryChanged(String searchQuery) {
    backendService.getShopResultsCount(searchQuery)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(result -> {
            if (isViewAttached()) {
                getView().hideShopSearchInProgress();
                getView().displayShopSearchResultCount(result.getSearchResponse().getNumberOfHits());
            }
        }, error -> {
            if (isViewAttached()) {
                getView().hideShopSearchInProgress();
            }
        });
}

在最好的情况下,我想模拟 backendService 并针对特定搜索查询和附加/分离视图测试此用例。

我做了一些研究,我知道toBlocking()test() 方法。他们都认为我有Observable 可用。我想我必须以某种方式拆分方法。您对此有何看法?

我的堆栈:RxJava2、dagger、MVP。

【问题讨论】:

    标签: android rx-java rx-java2


    【解决方案1】:

    在我们的项目中,我们编写如下代码:

    Mockito.when(backendService.getShopResult(Mockito.any())).thenReturn(Observable.just(Some Data)
    

    你可以通过以下方式解决调度程序:

    @Inject
    Scheduler subscribeOn;
    

    并且在测试中通过Schedulers.test()Schedulers.immediate()

    或者你不能使用TestRuleRxJavaPlugins.registerSchedulersHook()

    【讨论】:

      【解决方案2】:

      首先,如果这是一个真正的 MVP 项目,那么您应该以某种方式将 backendServiceview 注入到 Presenter 中。所以你可以用Mockito 模拟它们。 @СергейБоиштян 提供了如何做到这一点以及如何覆盖 Schedulers

      绝对你应该测试在控制backendService 行为时调用哪种视图方法。那是由Mockito.verify(...)完成的

      您还可以使用MockitoArgumentCaptor 测试backendService.getShopResultsCount(searchQuery) 的输出传递给view 的内容

      【讨论】:

      • 这些我都知道。这个问题针对的是 RxJava,而不是通常的 JUnit 测试。重写调度程序是要走的路。
      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2020-07-26
      • 2020-04-07
      • 1970-01-01
      相关资源
      最近更新 更多