[英]RxJava Schedulers.immediate() behavior while Unit Testing
我正在尝试为使用反应式接口的 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 与附加框架 SqlBrite-Dao 一起使用。 SqlBrite正在观察的特定的查询Scheduler
和当没有被提供到DaoManager
的SqlBrite-DAO, Schedulers.io()
而使用。 解决方案是向DaoManager.Builder
提供调度DaoManager.Builder
或应用 RxJavaPlugins 并返回Schedulers.immediate()
作为所有Schedulers
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.