Robolectric与Android数据库的房间数据库

问题描述 投票:0回答:1

如何在Robolectric的帮助下对房间数据库进行单元测试?

我不想做仪器测试。

android-room robolectric
1个回答
3
投票

据我所知,它可以这样做

//@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))
    }
}

看起来虽然你需要在DB的构建中使用allowMainThreadQueries()。

我不确定为什么每个人都可以在仪器测试中测试Dao,当它可以在单元测试中完成,然后被添加到代码覆盖中(也许其他人有一些见解)

这段代码在Kotlin中,但我相信它会转换为java。

这是提供给我的,为什么它不被认为是最佳实践https://developer.android.com/training/data-storage/room/testing-db

注意:即使此设置允许您的测试快速运行,也不建议这样做,因为您设备上运行的SQLite版本和用户设备可能与主机上的版本不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.