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)
}
答案 0 :(得分:2)
方法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)
}