【发布时间】:2019-05-30 14:26:55
【问题描述】:
我正在使用 AS 3.4.1 和运行 Android 9 的模拟器进行测试。
当我在其中使用Room Dao Function annotated with @Transaction 时,以下测试不会运行。
class RecurrenceManagerTest : DatabaseTest() {
@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()
var recurringEntryId: Long = -1
@Before
override fun setup() {
super.setup() // only initialized the db
val recurringEntry = RecurringEntry(
recurrence = Recurrence(DATE.toEpochMilli(), Recurrence.DAILY)
)
recurringEntryId = runBlocking { db.recurringEntryDao().insert(recurringEntry) }
val recurringBookEntry = BookEntry.create(
title = TITLE,
date = DATE,
value = VALUE,
isPaid = IS_PAID,
notes = NOTES,
entryType = ENTRY_TYPE,
categoryId = CATEGORY_ID,
contacts = CONTACTS,
recurringEntryId = recurringEntryId
)
runBlocking {
db.bookEntryDao().insert(recurringBookEntry) // BreakPoint #1
}
}
@Test
fun testInsertRecurrencesAndSchedule() {
var recurringEntry = runBlocking { db.recurringEntryDao().get(recurringEntryId) } // BreakPoint #2
assertThat(recurringEntry, notNullValue())
runBlocking { RecurrenceManager.insertRecurrencesAndSchedule(ApplicationProvider.getApplicationContext(), db, recurringEntry!!) }
val bookEntries = db.bookEntryDao().getBookEntries().liveDataValue()
}
}
这是插入函数:
@Transaction
suspend fun insert(bookEntry: BookEntry): Long {
val id = insert(bookEntry.entity)
bookEntry.embeddedContacts?.apply {
forEach {
it.id = 0
it.bookEntryId = id
}
}?.let {
insert(it)
}
return id
}
因此,如果我按原样运行测试(请参阅 BreakPoint #1),BreakPoint #2 甚至不会被调用,因此测试在之前的某个地方结束,没有结果。
如果我将 BreakPoint #1 处的代码替换为与 insert 函数完全相同的代码,则测试运行正常。
有人知道这里有什么问题吗?
【问题讨论】:
-
那是因为你在运行阻塞没有完成的情况下断言
-
@Stavro Xhardha 我认为运行阻塞要等到身体完成?有什么办法解决这个问题?
-
好吧,我真的不知道你的使用方式。但是请查看我在最后一节的帖子,我正在测试房间插入和选择。检查this
-
我对这个相关问题的回答表明目前这是不可能的:(stackoverflow.com/questions/57027850/…
标签: android kotlin android-room android-architecture-components kotlin-coroutines