rx-java - 使用 rx 链接时 Android 测试失败

标签 rx-java android-room

dao.insert(position)返回Unit (“Void”),dao.getPosition()返回Single<IssPosition>dbFailingTest失败并出现以下异常 Query returned empty result set: SELECT * FROM iss_position LIMIT 1 (但如果我将参数更改为 id = 1 并不重要)。我正在使用 Room。

为什么第一个测试失败而第二个测试失败?我相信它们是等价的,但显然不是。我希望我的代码最终看起来更像失败的测试,因为在我的存储库中我还将订阅一些外部事件。

@Test
fun dbFailingTest() {
    Completable
            .fromCallable { dao.insert(position) }
        //    .delay(1, TimeUnit.SECONDS)
            .to {
                dao.getPosition()
            }
            .test()
           // .awaitDone(1200, TimeUnit.MILLISECONDS)
            .assertResult(position)
}

@Test
fun dbPassingTest() {
    dao.insert(position)
    dao.getPosition()
            .test()
            .assertResult(position)
}

最佳答案

方法toCompletable转换为其他内容,而无需等待前者完成。它只是使用 Completable 作为参数来执行作为参数传递的函数。

另一方面,如果您使用Single:

@Test
fun dbFailingTest() {
    Single
            .fromCallable { dao.insert(position) }
            .flatMapMaybe { dao.getPosition() }
            .test()
            .assertResult(position)
}

flatMapMaybe 转换 Single结果,因此必须等待 Single 完成.

此外,如果您在测试类中使用 InstantTaskExecutorRule:

@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()

这段代码应该可以工作:

@Test
fun dbFailingTest() {
    dao.insert(position)
    dao.getPosition()
        .test()
        .assertResult(position)
}

关于rx-java - 使用 rx 链接时 Android 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51654194/

相关文章:

rx-java - 具有优先级的 RxJava Zip

android - 如何使用 Rx 管理多个观察者,以便仅保持一个与服务的打开连接?

java - 在加载了 LiveDate 对象的 fragment 中旋转屏幕后如何保持 ScrollView 中的滚动位置

java - 将我的模型对象存储在房间数据库中的内容

android - 处理RxJava的onErrorReturn和OnErrorNotImplementedException

使用 Retrofit2 调用 Android 单元测试 API

android - 编写多个网络调用 RxJava - Android

java - 房间数据库 RxJava 后台线程

java - Android Studio 中突然出现编译错误;错误 : cannot find symbol class ComputableLiveData

java - Android Room-插入之前如何检查同名实体?