编程语言
首页 > 编程语言> > 单元测试时RxJava Schedulers.immediate()行为

单元测试时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