带有房间数据库的Roboelectric Android

Din*_*jit 3 robolectric android-room

如何在Roboeletric的帮助下对Room Database进行单元测试?

我不想做仪器测试。

Cra*_*1hd 5

据我所知,可以这样做

//@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))
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎尽管在数据库的构建中需要allowMainThreadQueries()。

我不确定为什么每个人都可以在单元测试中进行测试然后在单元测试中进行测试,然后再将其添加到代码覆盖率中(也许其他人对此有所了解)

这段代码在Kotlin中,但是我确信它将转换为java。

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

注意:尽管此设置允许您的测试非常快速地运行,但不建议这样做,因为在设备(以及用户设备)上运行的SQLite版本可能与主机上的版本不匹配。

  • “可能与主机上的版本不匹配”这是我能想到的不加快测试的最奇怪的原因。Android 设备数量不计其数,运行着不同版本的操作系统。是什么让任何人认为在单个设备/模拟器上勉强缓慢地测试代码比在主机上运行它们更好? (3认同)