簡體   English   中英

RxJava 單元測試 Observable interval,隨着時間的推移改變響應

[英]RxJava Unit test Observable interval, Change response by advancing through time

我的存儲庫中有一個具有可觀察間隔的網絡輪詢功能

class repository @Inject constructor(
    private val api: api,
    private val schedulerProvider: SchedulerProvider
) {

    private fun networkPoll(): Observable<response> {
        return Observable.interval(1L, TimeUnit.Seconds, schedulerProvider.io())
            .startWith(0L)
            .flatMap {
                api.getStatus().subscribeOn(schedulerProvider.io()).toObservable()
            }
    }

    private fun pollStates(): Observable<State> {
        return networkPoll()
            .map {
                // map the response to State1, State2, State3
            }
    }

    fun pollForState3(): Observable<State> {
        return pollStates()
            .subscribeOn(schedulerProvider.io())
            .takeUntil {
                it is State3
            }
    }

}

如何對 pollForState3 進行單元測試並通過時間推進來更改響應?

我通過這樣做解決了它

private lateinit var repository: Repository
private val schedulerProvider = TestSchedulerProvider()

@Mock
private lateinit var api: Api

    @Before
    fun setup() {
        repository = repository(api, schedulerProvider)
    }

@Test
fun test() {
    `when`(api.getStatus()).thenReturn(
        // return such a way that pollStates function map this to State1
    )
    val testObserver = repository.pollForState3().test()
    schedulerProvider.ioScheduler.advanceTimeBy(1L, TimeUnit.MILLISECONDS)
    testObserver.assertValue {
        it is State1
    }
    testObserver.assertNotTerminated()

    `when`(api.getStatus()).thenReturn(
        // now return such a way that pollStates function map this to State3
    )
    schedulerProvider.ioScheduler.advanceTimeBy(2L, TimeUnit.SECONDS)
    testObserver.assertValue {
        it is State3
    }
    testObserver.assertTerminated()
    testObserver.dispose()
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM