繁体   English   中英

单元测试时的 RxJava Schedulers.immediate() 行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM