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);
}
});
}
你可以在'getMainThreadScheduler'中添加一些日誌來檢查它是否被調用?您的代碼中可能有其他競爭條件。在代碼中顯示如何使用調度程序會很棒。 – zsxwing
您的'load'實現是異步的(在Schedulers.io()中訂閱)。因此,你不應該在立即調用'load'之後進行驗證。 – zsxwing
是的你是對的,我實際上已經解決了在演示者中刪除rxjava的所有依賴關係,所以有一個調用rxjava的包裝,但是在測試中我使用了不使用rxjava的不同包裝。最後,我不想測試rxjava,但我的演示者的邏輯:) –