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