2016-12-20 239 views
1

我对单元测试RxJava代码部分有些麻烦。我想测试下面的方法。这是一个主持人的方法。RxJava2 JUnit测试

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。

回答

1

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

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

U可以通过变通办法调度:

@Inject 
Scheduler subscribeOn; 

而且在检验合格Schedulers.test()Schedulers.immediate()

或u不能使用TestRuleRxJavaPlugins.registerSchedulersHook()

1

首先,如果这是一个真正的MVP项目,那么你应该有backendServiceview注入演讲者。所以你可以用Mockito来嘲笑他们。 @СергейБоиштян提供了如何操作以及如何覆盖Schedulers的方法。

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

你也可以检验一下输出backendService.getShopResultsCount(searchQuery)传递给view使用MockitoArgumentCaptor

+0

我知道这一切完成。这个问题的目标是RxJava,而不是美国的JUnit测试。重写调度程序是最好的选择。 –