RxJava2 JUnit 测试

RxJava2 JUnit testing

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

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 并针对特定搜索查询和 attached/detached 视图测试此用例。

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

我的技术栈:RxJava2、dagger、MVP。

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

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

您可以通过以下方式解决调度程序问题:

@Inject
Scheduler subscribeOn;

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

或者你不能将 TestRuleRxJavaPlugins.registerSchedulersHook()

一起使用

首先,如果这是一个真正的 MVP 项目,那么您应该以某种方式将 backendServiceview 注入到 Presenter 中。所以你可以用 Mockito 来嘲笑他们。 提供了如何操作以及如何覆盖 Schedulers.

当然你应该测试在控制backendService行为时调用哪个视图方法。这是由 Mockito.verify(...)

完成的

您还可以使用 MockitoArgumentCaptor

来测试从 backendService.getShopResultsCount(searchQuery) 传递给 view 的输出