如何在Robolectric的帮助下对房间数据库进行单元测试?
我不想做仪器测试。
据我所知,它可以这样做
//@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版本和用户设备可能与主机上的版本不匹配。