如何借助Roboeletric对机房数据库进行单元测试?
我不想做插装测试。
发布于 2019-03-13 01:08:55
据我所知,它可以这样做
//@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版本-以及您用户的设备-可能与您主机上的版本不匹配。
发布于 2020-03-09 12:01:29
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()
}
}https://stackoverflow.com/questions/54327392
复制相似问题