单元测试时RxJava Schedulers.immediate()行为
作者:互联网
我正在尝试为使用反应性接口的DAO对象编写测试.我有一个包含食谱的表,我想测试一下,当我向该表中插入数据时,订阅者会收到包含食谱的列表.
我正在使用TestSubscriber类,并对该类执行断言.我的简单测试如下所示:
@Test
fun testSubscriber() {
insertItem()
val testSubscriber = TestSubscriber.create<List<Recipe>>()
recipeDao
.getRecipes()
.subscribeOn(Schedulers.immediate())
.subscribe(testSubscriber)
testSubscriber.assertNoErrors()
testSubscriber.assertNoTerminalEvent()
testSubscriber.assertNotCompleted()
testSubscriber.assertValueCount(1)
assertEquals(1, testSubscriber.onNextEvents[0].size)
}
问题在于断言testSubscriber.assertValueCount(1)失败,因为未发出任何项目.但是当我在上面插入这一行时
testSubscriber.awaitTerminalEvent(500,TimeUnit.MILLISECONDS),测试成功.我的observable不会发出终端事件,因此会执行超时,但是在等待的同时,使用配方列表调用了onNext.
我的getRecipes方法:
fun getRecipes(): Observable<List<Recipe>> {
return query(SELECT("*")
.FROM(Recipe.TABLE_NAME)
.ORDER_BY(Recipe.COL_NAME))
.run()
.mapToList(RecipeMapper.MAPPER)
}
那怎么可能?我以为,当我使用Schedulers.immediate()时,该操作将在同一线程上执行,并且我的TestSubscriber接收事件.如果没有,我应该如何编写此测试以使其成功?我想测试是否调用了onNext,并且不想在两者之间插入人工睡眠命令.
解决方法:
问题是我正在使用带有附加框架SqlBrite-Dao的库SqlBrite. SqlBrite正在观察特定Scheduler上的查询,并且当未向SqlBrite-Dao的DaoManager提供任何查询时,将使用Schedulers.io().解决方案是向DaoManager.Builder提供调度程序,或应用RxJavaPlugins并返回Schedulers.immediate()作为所有调度程序.
标签:unit-testing,rx-java,kotlin,java,android 来源: https://codeday.me/bug/20191118/2025036.html