2016-04-15 88 views
6

我想測試使用RxJava從交互器中檢索數據的演示者。在設置方法,我做這樣的事情:Schedulers.immediate()不能用於命令行Gradle測試

@Before 
public void setup() { 
    RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() { 
     @Override 
     public Scheduler getMainThreadScheduler() { 
      return Schedulers.immediate(); 
     } 
    }); 
} 

所以在我的測試方法我可以測試演示電話:

@Test 
public void testLoad() { 
    presenter.load(); 
    verify(view).dataLoaded(data); 
    verify(interactor).load(); 
} 

如果我運行了Android工作室一切工作的測試不如預期,問題是,如果我嘗試在命令行

gradle test 

然後測試失敗,因爲: Actually, there were zero interactions with this mock.

所以我試圖把一個Thread.sleep(2000)在對主講者的調用之後立即工作,所以我猜Schedulers.immediate();不是從命令行工作,但我不知道爲什麼以及如何調試/修復。你有什麼主意嗎?

編輯:主持人實施 - >

public void load() { 
    Observable<List<Data>> obs = interactor.load() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()); 
    obs.subscribe(new Observer<List<Data>>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(List<Data> data) { 
      view.dataLoaded(data); 
     } 
    }); 
} 
+0

你可以在'getMainThreadScheduler'中添加一些日誌來檢查它是否被調用?您的代碼中可能有其他競爭條件。在代碼中顯示如何使用調度程序會很棒。 – zsxwing

+0

您的'load'實現是異步的(在Schedulers.io()中訂閱)。因此,你不應該在立即調用'load'之後進行驗證。 – zsxwing

+0

是的你是對的,我實際上已經解決了在演示者中刪除rxjava的所有依賴關係,所以有一個調用rxjava的包裝,但是在測試中我使用了不使用rxjava的不同包裝。最後,我不想測試rxjava,但我的演示者的邏輯:) –

回答

0

你可以嘲笑RxJava調度程序也是如此。

RxJavaHooks.reset(); 
RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate()); 

通常一個好東西叫重置設置&拆卸。