gpt4 book ai didi

android - 如何使用 Mockk 使用Transaction 方法模拟 android 房间

转载 作者:行者123 更新时间:2023-12-05 00:09:57 25 4
gpt4 key购买 nike

我正在尝试为我的业务逻辑进行一些单元测试。
我有存储库,我将响应中的一些数据保存到房间数据库(2.1.0-rc01)。
在单个事务中将数据保存到具有不同 dao 的不同表中。
代码简化:

项目库

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 库。如何使用Transaction 方法模拟房间? 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)
}
}

最佳答案

您首先必须为 Android Room KTX 方法启用静态模拟 withTransaction {} .您还需要捕获传递给它的挂起 lambda 函数。可以调用这个捕获的函数,以便它内部的代码运行。由于您正在模拟所有数据库调用,因此您不需要在这里进行真正的事务。

@Before
fun initMocks() {
MockKAnnotations.init(this)

mockkStatic(
"androidx.room.RoomDatabaseKt"
)

val transactionLambda = slot<suspend () -> R>()
coEvery { db.withTransaction(capture(transactionLambda)) } coAnswers {
transactionLambda.captured.invoke()
}
}

然后,您应该能够按照编写的方式运行您的代码。

关于android - 如何使用 Mockk 使用Transaction 方法模拟 android 房间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com