首页 > 解决方案 > 带有安卓房间数据库的 Roboelectric

问题描述

如何借助 Roboeletric 对 Room Database 进行单元测试?

我不想做仪器测试。

标签: android-roomrobolectric

解决方案


据我所知,它可以这样做

//@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 版本(以及您的用户设备)可能与您主机上的版本不匹配。


推荐阅读