带有房间数据库的Roboelectric Android

时间:2019-01-23 12:33:12

标签: android-room robolectric

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

我不想进行仪器测试。

2 个答案:

答案 0 :(得分:2)

Robolectric可以使用Room支持此类JVM单元测试。

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

testImplementation 'androidx.test:core:1.2.0'

我们假设我们有一个存储Room Dao的存储库类。这是一个简单的示例:

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

答案 1 :(得分:1)

据我所知,可以这样做

//@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()。

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

这段代码在Kotlin中,但是我敢肯定它会翻译成java一样。

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

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