我目前正在使用新的Android Architecture Components开发应用程序。具体来说,我正在实现一个房间数据库,LiveData
它在其中一个查询中返回一个对象。插入和查询按预期工作,但是我在使用单元测试测试查询方法时遇到问题。
这是我要测试的 DAO:
NotificationDao.kt
@Dao
interface NotificationDao {
@Insert
fun insertNotifications(vararg notifications: Notification): List<Long>
@Query("SELECT * FROM notifications")
fun getNotifications(): LiveData<List<Notification>>
}
如您所知,查询函数返回一个LiveData
对象,如果我将其更改为List
,Cursor
或基本上任何内容,那么我会得到预期的结果,即插入数据库中的数据。
问题是以下测试总是会失败,因为对象value
的LiveData
总是null
:
NotificationDaoTest.kt
lateinit var db: SosafeDatabase
lateinit var notificationDao: NotificationDao
@Before
fun setUp() {
val context = InstrumentationRegistry.getTargetContext()
db = Room.inMemoryDatabaseBuilder(context, SosafeDatabase::class.java).build()
notificationDao = db.notificationDao()
}
@After
@Throws(IOException::class)
fun tearDown() {
db.close()
}
@Test
fun getNotifications_IfNotificationsInserted_ReturnsAListOfNotifications() {
val NUMBER_OF_NOTIFICATIONS = 5
val notifications = Array(NUMBER_OF_NOTIFICATIONS, { i -> createTestNotification(i) })
notificationDao.insertNotifications(*notifications)
val liveData = notificationDao.getNotifications()
val queriedNotifications = liveData.value
if (queriedNotifications != null) {
assertEquals(queriedNotifications.size, NUMBER_OF_NOTIFICATIONS)
} else {
fail()
}
}
private fun createTestNotification(id: Int): Notification {
//method omitted for brevity
}
所以问题是:有谁知道执行涉及 LiveData 对象的单元测试的更好方法?