RxJava 2 mock Observable不起作用

时间:2018-04-06 05:20:03

标签: android kotlin rx-java2 rx-kotlin2

我使用RxJava 2 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) } ) } 并听取它的事件

barcodeObservable

Observable<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()并接收我提供的对象(?<year>[0-9]{2,4})\/(?<month>[0-9]{1,2})\/(?<day>[0-9]{1,2})事件。但这不会发生。我究竟做错了什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

由于订阅和观察给定的调度程序,正在进行异步处理。 onNext()不会按照测试代码的预期同步调用。

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