使用RX链接时Android测试失败

时间:2018-08-02 12:53:18

标签: 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)
}

1 个答案:

答案 0 :(得分:2)

方法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)
}