【问题标题】:RxJava 2 mock Observable doesn't workRxJava 2 模拟 Observable 不起作用
【发布时间】:2018-04-06 05:20:03
【问题描述】:

我使用 RxJava 2 Observable 将条形码扫描仪包装在我的一个应用程序中。这个 sn-p 展示了我如何订阅 Observable 并收听它的事件

override fun start() {
    disposables.addAll(subscribeToBarcodeReader(), loadUser())
}

private fun subscribeToBarcodeReader(): Disposable {
    return barcodeObservable
        .subscribeOn(bgScheduler)
        .observeOn(mainScheduler)
        .subscribeBy(
                onNext = { barcode -> saveBarcode(barcode) },
                onComplete = { Log.d(TAG, "Barcode observable complete") },
                onError = { e -> Log.d(TAG, "Barcode observable error", e) }
        )
}

barcodeObservableObservable<Barcode> 类型的对象。这一切都可以在带有真正条形码扫描仪的真实设备上正常工作。现在我想对saveBarcode() 方法进行单元测试并尝试以这种方式模拟Observable<Barcode>

@RunWith(MockitoJUnitRunner::class)
class OrbFoldersPresenterTests {

    @Mock
    private lateinit var jobService: FolderJobService
    private val bgScheduler = TestScheduler()
    private val mainScheduler = TestScheduler()
    private val barcodeObservable: Observable<Barcode> = Observable.just(Barcode(
            "2500020109205", LocalDateTime.now().toString()))
    @Mock
    private lateinit var userStore: UserStore
    @Mock
    private lateinit var prefs: Preferences
    @Mock
    private lateinit var barcodeService: BarcodeReadService

    @Test
    fun testBarcodeSave() {
        val jobId = 201804040001
        val disposables = CompositeDisposable()

        whenever(userStore.authorizedUser()).thenReturn(Maybe.just(User()))

        val presenter = OrbFoldersPresenter(jobId, jobService, disposables, bgScheduler,
                mainScheduler, barcodeObservable, userStore, prefs, barcodeService)
        presenter.start()
    }
}

我希望当我调用 presenter.start() 时,演示者必须订阅 barcodeObservable 并使用我提供的对象接收 onNext() 事件。但这并没有发生。我究竟做错了什么?

【问题讨论】:

    标签: android kotlin rx-java2 rx-kotlin2


    【解决方案1】:

    如果您需要使用流测试时间,TestScheduler 很有用。由于您对实现的唯一关注应该是同步运行流,因此您最好使用Schedulers.trampoline()。然后这将调用订阅和观察,而无需更改线程。

    【讨论】:

      【解决方案2】:

      由于订阅和观察给定的调度程序,异步处理正在进行。 onNext() 没有像您的测试代码预期的那样被同步调用。

      使用TestScheduler,您可以例如调用triggerActions()advanceTimeBy()执行异步代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多