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,但我的演示者的逻辑:) –