首页 > 解决方案 > 用于单元测试的模拟房间数据库

问题描述

我正在尝试为我的业务逻辑进行一些单元测试。

数据被读取并写入 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?

也许还有另一种解决方案?

标签: androidunit-testingandroid-room

解决方案


在 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


推荐阅读