android - 用于单元测试的模拟房间数据库
问题描述
我正在尝试为我的业务逻辑进行一些单元测试。
数据被读取并写入 Room 数据库,因此逻辑取决于我的数据库中的内容。
我可以轻松地buildInMemoryDatabase
测试所有逻辑,但使用速度较慢且需要连接设备的仪器测试。
RoomRepository
我只想在用其他Repository
接口实现替换我的地方运行单元测试
class RoomRepository(
private val database: RoomDatabase //actual room database
): Repository {
override fun getFooByType(type: Int): Maybe<List<Item>> {
return database.fooDao()
.getFooByType(type)
.map { names ->
names.map { name -> Item(name) }
}
.subscribeOn(Schedulers.io())
}
}
也许有一种方法可以在主机上运行 Room sqlite?
也许还有另一种解决方案?
解决方案
在 RoomDatabase 周围创建一个名为“Repository”的包装类,并具有公开 Dao 对象的方法。通过这种方式,我们可以轻松地模拟存储库类,如下所示
Open class Repository(private val roomDatabase:RoomDatabase){
open fun productsDao():ProductsDao = roomDatabase.productDao()
open fun clientsDao():ClientsDao = roomDatabase.clientsDao()
//additional repository logic here if you want
}
现在,在测试中,这个类可以很容易地被嘲笑为
val repositoryMock = mock(Repository::class.java)
val productsDaoMock = mock(ProductsDao::class.java)
when(repositoryMock.productsDao()).thenReturn(productsDaoMock)
when(productsDaoMock.getProducts()).thenReturn(listof("ball","pen")
因此,在项目的所有地方注入和使用存储库类而不是 RoomDatabase 类,以便可以轻松地模拟存储库和所有 Dao
推荐阅读
- java - 不加锁是否可以快速解决多线程银行账户问题?
- matlab - 如何制作一个 for 循环来读取多个 txt 文件?
- r - 如何使用 R 的 fft() 函数计算正确的幅度?
- pandas - 将自定义函数应用于滚动数据框
- c# - this.Location = Screen.AllScreens[1].WorkingArea.Location;
- java - editText 中的 datPicker 格式错误
- javascript - 如何在没有 JavaScript 文本 ID 的内容文档正文下编写写入/编辑文本?
- python-3.x - 使用动态搜索和自动完成将旧值返回到组合框
- mongodb - monodb 可以用 $in 做到这一点,多个输入和固定条件,输出像分组结果
- reactjs - 第二次分派动作时不会触发 Saga