android-room - 带有安卓房间数据库的 Roboelectric
问题描述
如何借助 Roboeletric 对 Room Database 进行单元测试?
我不想做仪器测试。
解决方案
据我所知,它可以这样做
//@RunWith(AndroidJUnit4::class)
@RunWith(RobolectricTestRunner::class)
class WordDaoTest {
private lateinit var wordRoomDatabase: WordRoomDatabase
private lateinit var wordDao: WordDao
@get:Rule
var instantTaskExecutor = InstantTaskExecutorRule()
@Before
fun createDb() {
val context = InstrumentationRegistry.getInstrumentation().targetContext
wordRoomDatabase = Room.inMemoryDatabaseBuilder(context, WordRoomDatabase::class.java).allowMainThreadQueries().build()
wordDao = wordRoomDatabase.wordDao()
wordRoomDatabase.wordDao().insertAll(listOf<Word(Word("one"),Word("two"),Word("three"))
}
@After
fun closeDb() {
wordRoomDatabase.close()
}
@Test
fun testGetName() {
Assert.assertThat(getValue(wordDao.getAllLiveWords()).size, equalTo(3))
}
}
似乎您在数据库的构建中需要 allowMainThreadQueries() 。
我不确定为什么每个人都在仪器测试中测试 Dao,什么时候可以在单元测试中完成,然后添加到代码覆盖率中(也许其他人有一些见识)
这段代码在 Kotlin 中,但我确信它会以同样的方式转换为 java。
这是提供给我的,但是关于为什么它不被认为是最佳实践 https://developer.android.com/training/data-storage/room/testing-db
注意:尽管此设置允许您的测试运行得非常快,但不建议这样做,因为您设备上运行的 SQLite 版本(以及您的用户设备)可能与您主机上的版本不匹配。
推荐阅读
- google-sheets - 谷歌表格如果下拉
- database - H2 数据库备份仅适用于 linux
- sql - 如何获取子字符串直到第二次出现分隔符
- python - 是否可以通过指定日期范围对 Pandas 数据框中的值进行重新采样和求和?
- regex - 正则表达式:从 x 到 y 数字中提取最大的数字
- sql - 根据 ID 比较来自同一输入文件的行之间的日期,并使用 SQL Server 按增量日期复制行
- mysql - PL-SQL - 我可以将枚举作为函数参数传递吗?
- python - 带有日期和时间的 reportlab LinePlot 轴
- java - 无法向尤里卡服务器注册 spring 配置客户端
- c# - 图像比较算法