Я пытаюсь сделать несколько юнит-тестов для моей бизнес-логики.
У меня есть хранилище, в котором я сохраняю в базу данных комнаты (2.1.0-rc01) некоторые данные из ответа.
Сохранение данных в разных таблицах с разным дао в одной транзакции.
Код упрощен:
ItemRepository
suspend fun saveItems(response: Response) {
val items = response.items.map { it.toLocalItem() }
val subItems = response.items.flatMap { item ->
item.subItems.map { it.toLocal(item.id) }
}
db.withTransaction {
db.itemDao().deleteAll()
db.itemDao().insertAll(items)
db.subItemDao().insertAll(subItems)
}
}
Для юнит-теста я использую библиотеку Mockk. Как я могу смоделировать комнату с методом транзакции? withTransaction объявляется как
suspend fun <R> RoomDatabase.withTransaction(block: suspend () -> R): R
Я пытаюсь написать тест
@MockK
private lateinit var database: AppDatabase
@MockK
private lateinit var itemDao: ItemDao
@MockK
private lateinit var subItemDao: SubItemDao
@Test
fun checkSaveItems() = runBlocking {
repository = ItemRepository(database)
coEvery { database.itemDao() } returns itemDao
coEvery { database.subItemDao() } returns subItemDao
//TODO: execute database.withTransaction(block: suspend () -> R)
coEvery { itemDao.deleteAll() } just Runs
coEvery { itemDao.insertAll(any()) } just Runs
coEvery { subItemDao.insertAll(any()) } just Runs
repository.saveItems(testResponse)
coVerifySequence {
itemDao.deleteAll()
itemDao.insertAll(testItems)
subItemDao.insertAll(testSubItems)
}
}