首页 > 解决方案 > 使用 rx 链接时 Android 测试失败

问题描述

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

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

@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)
}

标签: rx-javaandroid-room

解决方案


方法to转换Completable为其他东西,而无需等待前者完成。它只是执行作为参数传递的函数,使用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)
}

推荐阅读