RxJava2 JUnit测试

3

我在进行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。
2个回答

2
今日免费次数已满, 请开通会员/明日再来
Mockito.when(backendService.getShopResult(Mockito.any())).thenReturn(Observable.just(Some Data)

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

@Inject
Scheduler subscribeOn;

在测试通过时,可以使用Schedulers.test()Schedulers.immediate()

或者您可以将RxJavaPlugins.registerSchedulersHook()TestRule一起使用。


0

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

当控制backendService的行为时,你应该测试哪个视图方法被调用。这可以通过Mockito.verify(...)来完成。

你还可以使用MockitoArgumentCaptor来测试从backendService.getShopResultsCount(searchQuery)返回的输出是否传递给了view


我知道这些。问题的重点是RxJava,而不是通常的JUnit测试。覆盖调度程序是正确的方法。 - Marcin Kunert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接