RxJava单元测试永远运行

时间:2017-07-10 14:03:16

标签: unit-testing rx-java

我使用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()区域被打破。

1 个答案:

答案 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