Робоэлектрик с комнатой базы данных для Android - PullRequest
0 голосов
/ 23 января 2019

Как выполнить модульное тестирование Room Database с помощью Roboeletric?

Я не хочу проводить инструментальное тестирование.

1 Ответ

0 голосов
/ 12 марта 2019

Из того, что я могу сказать, это можно сделать так

//@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, работающая на вашем устройстве - и устройствах ваших пользователей - может не соответствовать версии на вашем хост-компьютере.

...