Android 使用 rx 链接时测试失败

Android test failing when using rx chaining

dao.insert(position) returns Unit ("Void"), dao.getPosition() returns 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)
}

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

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

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

flatMapMaybe转换Single结果,所以必须等待Single完成。

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

@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()

此代码应该有效:

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