LoginSignup
2
0

More than 5 years have passed since last update.

RxJavaでbufferオペレーターを使ったユニットテストでハマった

Posted at

この記事は雑です。

結論

RxJavaPlugins.set***SchedulerHandlertrampoline を設定していたけど、 setIoSchedulerHandler だけにした。

RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }

なぜ

こんな感じのTestRuleを書いていたのだけど、

RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
RxJavaPlugins.setComputationSchedulerHandler { Schedulers.trampoline() }
...

テスト対象のコードに、 buffer オペレーターがあると、bufferオペレーターは内部的に computation スケジューラーを利用しているので、 trampoline スケジューラーに上書きしてしまうことで無限に待ち続けてしまって、テストが終わらなくなる。

@Test
fun testBuffer() {
    val subject = PublishSubject.create<Int>()
    val testObserver = subject
        .buffer(1, TimeUnit.SECONDS)
        .filter { it.isNotEmpty() }
        .test()

    subject.onNext(1)
    subject.onNext(2)

    testObserver.await(2, TimeUnit.SECONDS)
    testObserver.assertValues(listOf(1, 2))
}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0