【发布时间】:2016-08-07 16:51:35
【问题描述】:
我正在尝试测试使用 RxJava 从交互器检索数据的演示者。在设置方法中,我正在做类似的事情:
@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 Studio 运行测试,一切都按预期工作,问题是如果我在命令行上尝试
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中添加一些日志来检查它是否被调用?您的代码中可能还有其他竞争条件。很高兴展示您如何在代码中使用调度程序。 -
您的
load实现是异步的(在 Schedulers.io() 中订阅)。因此,您不应该在一次调用load之后进行验证。 -
是的,你是对的,我实际上已经解决了在演示者中删除 rxjava 的所有依赖问题,所以有一个调用 rxjava 的包装器,但在测试中我使用了一个不同的包装器t 使用 rxjava。最后,我不想测试rxjava,而是我的presenter的逻辑:)
标签: android unit-testing rx-java