3

我在对 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为特定的搜索查询和附加/分离视图模拟和测试这个用例。

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

我的堆栈:RxJava2、dagger、MVP。

4

2 回答 2

2

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

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

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

@Inject
Scheduler subscribeOn;

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

或者你不能TestRuleRxJavaPlugins.registerSchedulersHook()

于 2016-12-20T13:11:30.193 回答
0

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

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

您还可以使用's测试backendService.getShopResultsCount(searchQuery)传递给的输出viewMockitoArgumentCaptor

于 2016-12-20T13:17:04.183 回答