2017-11-14 14 views
0

実際に遅延時間を待たずに遅延放出を持つObservableのユニットテストができたいと思っています。これを行う方法はありますか?単位テスト遅延があるRxjava観測値

現在、CountDownHatchを使用してアサートを遅延させていますが、正常に動作しますが、テスト実行時間が長くなります。

例:

val myObservable: PublishSubject<Boolean> = PublishSubject.create<Boolean>() 
fun myObservable(): Observable<Boolean> = myObservable.delay(3, TimeUnit.SECONDS) 

@Test 
fun testMyObservable() { 
    val testObservable = myObservable().test() 
    myObservable.onNext(true) 

    // val lock = CountDownLatch(1) 
    // lock.await(3100, TimeUnit.MILLISECONDS) 
    testObservable.assertValue(true) 
} 

答えて

1

TestSchedulerは、この最適です。それは便利な方法を持っていますadvanceTimeBy(long, TimeUnit)は、タイミングを制御することができます。 Observable.delayoverload methodSchedulerとなります。

したがって、myObservable機能ではデフォルトのScheduler.computation()を使用し、ユニットテストにはTestSchedulerを使用してください。

1

@ aaron-heの答えにより、私は完全な解決策を思いついた。

TestSchedulerの組み合わせで時間を進めると同時にRxJavaPluginsを使用して、デフォルトのスケジューラをtestSchedulerで上書きします。これにより、変更なしで、またはSchedulerを渡す必要なく、myObservable()機能のテストが可能になりました。

@Before 
fun setUp() = RxJavaPlugins.reset() 

@After 
fun tearDown() = RxJavaPlugins.reset() 

@Test 
fun testMyObservable() { 
    val testScheduler = TestScheduler() 
    RxJavaPlugins.setComputationSchedulerHandler { testScheduler } 

    val testObservable = myObservable().test() 
    myObservable.onNext(true) 

    testScheduler.advanceTimeBy(2, TimeUnit.SECONDS) 
    testObservable.assertEmpty() 
    testScheduler.advanceTimeBy(2, TimeUnit.SECONDS) 
    testObservable.assertValue(true) 
} 
関連する問題