我在单元测试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。
答案 0 :(得分:1)
在我们的项目中,我们编写如下代码:
Mockito.when(backendService.getShopResult(Mockito.any())).thenReturn(Observable.just(Some Data)
您可以通过以下方式解决调度程序:
@Inject
Scheduler subscribeOn;
在测试通行证Schedulers.test()
或Schedulers.immediate()
或您无法将TestRule
与RxJavaPlugins.registerSchedulersHook()
答案 1 :(得分:1)
首先,如果这是一个真正的MVP项目,那么你应该以某种方式将backendService
和view
注入到演示者中。所以你可以用Mockito
来模仿它们。 @СергейБоиштян提供了如何操作的方式以及如何覆盖Schedulers
。
当然,您应该在控制backendService
行为时测试调用哪种视图方法。这是由Mockito.verify(...)
您还可以使用backendService.getShopResultsCount(searchQuery)
的{{3}}
view
的哪个输出传递给Mockito