Тест инструментария Android не запускается до конца при использовании функции Room @Transaction - PullRequest
1 голос
/ 30 мая 2019

Я тестирую с 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, тест выполняется правильно.

Кто-нибудь знает, в чем здесь проблема?

1 Ответ

1 голос
/ 08 июня 2019

Я столкнулся с той же проблемой, и проблема была из-за InstantTaskExecutorRule, если вы удалите приведенный ниже блок кода, @Transaction должен найти с ключевым словом suspend

@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()

Похоже, что это правило блокирует RoomDatabase от получения потока транзакции. В RoomDatabase.kt он получает блок в следующей функции:

private suspend fun Executor.acquireTransactionThread(controlJob: Job): ContinuationInterceptor

Надеюсь, это поможет!

...