我使用RxJava 1.1.2并且我想编写一些单元测试。我正在使用RxJavaPlugins.getInstance().registerSchedulersHook()
和RxAndroidPlugins.getInstance().registerSchedulersHook()
,就像在此处https://medium.com/azimolabs/testing-rx-code-7918d7ee1680一样。我的测试看起来像这样:
@Test
public void xxxTest() {
Assert.assertSame(Schedulers.immediate(), Schedulers.io());
Assert.assertSame(Schedulers.immediate(), Schedulers.computation());
Assert.assertSame(Schedulers.immediate(), Schedulers.newThread());
Assert.assertSame(Schedulers.immediate(), AndroidSchedulers.mainThread());
presenter.xxx();
verify(view, Mockito.only()).xxxResult();
}
,presenter
中的方法如下:
public void xxx() {
String[] items = new String[]{"one", "two", "three"};
Observable.zip(Observable.from(items), Observable.interval(2, TimeUnit.SECONDS), (s, aLong) -> null)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(() -> view.xxxResult())
.doOnUnsubscribe(() -> view.xxxResult())
.subscribe();
}
当我运行测试时,它启动,进入xxx()
方法(这证明了更改的调度程序立即工作 - 感谢Assert.assertSame
)并且永远不会返回。因此,测试将永远运行,并且永远不会与verify(view, Mockito.only()).xxxResult();
一致。
注意:我不想从1.1.2升级到最新的RxJava。
到目前为止我进行的一些测试:
Schedulers.trampoline()
使用RxJava 1.1.2时,它仍然会永远运行(NOK)Schedulers.immediate()
使用RxJava 1.1.7时,它不会永远运行(OK)Schedulers.trampoline()
使用RxJava 1.1.7时,它不会永远运行(OK)Schedulers.immediate()
使用RxJava 1.3.0时,它不会永远运行(OK)Schedulers.trampoline()
使用RxJava 1.3.0时,它不会永远运行(OK)看起来RxJava 1.1.2在RxJavaPlugins.getInstance().registerSchedulersHook()
和RxAndroidPlugins.getInstance().registerSchedulersHook()
区域被打破。
答案 0 :(得分:0)
您应该使用TestScheduler类,以便在测试期间“控制”时间。
@Test
public void xxxTest() {
// Arrange everything needed for the test
TestScheduler scheduler = new TestScheduler();
... // replace all schedulers with test scheduler here
Assert.assertSame(scheduler, Schedulers.io());
Assert.assertSame(scheduler, Schedulers.computation());
Assert.assertSame(scheduler, Schedulers.newThread());
Assert.assertSame(scheduler, AndroidSchedulers.mainThread());
// Act on the class
presenter.xxx();
scheduler.advanceTimeBy(2, TimeUnit.SECONDS);
// Assert the result correctness
verify(view, Mockito.only()).xxxResult();
}
关于此
,有一个非常好的blog post