2016-12-20 237 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測試。重寫調度程序是最好的選擇。 –