我使用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})
事件。但这不会发生。我究竟做错了什么?
答案 0 :(得分:2)
如果您需要使用流测试计时,TestScheduler
非常有用。由于您对实现的唯一关注应该是同步运行流,因此最好使用Schedulers.trampoline()
。然后,这将调用订阅和观察,而无需更改线程。
答案 1 :(得分:1)
由于订阅和观察给定的调度程序,正在进行异步处理。 onNext()
不会按照测试代码的预期同步调用。
使用TestScheduler
,您可以例如调用triggerActions()
或advanceTimeBy()
来执行异步代码。