首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于android的Roboelectric和房间数据库

用于android的Roboelectric和房间数据库
EN

Stack Overflow用户
提问于 2019-01-23 20:33:12
回答 2查看 3.3K关注 0票数 8

如何借助Roboeletric对机房数据库进行单元测试?

我不想做插装测试。

EN

回答 2

Stack Overflow用户

发布于 2019-03-13 01:08:55

据我所知,它可以这样做

代码语言:javascript
复制
//@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版本-以及您用户的设备-可能与您主机上的版本不匹配。

票数 12
EN

Stack Overflow用户

发布于 2020-03-09 12:01:29

Robolectric可以通过Room支持这样的JVM单元测试。

要获取所需的上下文,请在您的build.gradle中添加以下依赖项:

代码语言:javascript
复制
testImplementation 'androidx.test:core:1.2.0'

假设我们有一个封装了Room Dao的存储库类。下面是一个简单的例子:

代码语言:javascript
复制
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [28]) // This config setting is the key to make things work
class FooRepositoryTest {

    @get:Rule
    var instantTask = InstantTaskExecutorRule()

    private lateinit var database: MyDatabase

    private lateinit var sut: FooRepository

    @Before
    fun setUp() {
        val context = ApplicationProvider.getApplicationContext<Context>()
        database = Room.inMemoryDatabaseBuilder(context, MyDatabase::class.java)
            .allowMainThreadQueries()
            .build()
        sut = FooRepository(database.fooDao())
    }

    @After
    fun tearDown() {
        database.close()
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54327392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档