RxJava2 JUnit测试

时间:2016-12-20 12:59:41

标签: android rx-java rx-java2

我在单元测试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,匕首,MVP。

2 个答案:

答案 0 :(得分:1)

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

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

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

@Inject
Scheduler subscribeOn;

在测试通行证Schedulers.test()Schedulers.immediate()

或您无法将TestRuleRxJavaPlugins.registerSchedulersHook()

一起使用

答案 1 :(得分:1)

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

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

完成的

您还可以使用backendService.getShopResultsCount(searchQuery)的{​​{3}}

测试view的哪个输出传递给Mockito