Aktualnie pracuję nad aplikacją przy użyciu nowego Android Architecture Components. W szczególności implementuję bazę danych pokoju, która zwraca obiekt LiveData
w jednym z zapytań. Wstawianie i zapytania działają zgodnie z oczekiwaniami, jednak mam problem testujący metodę zapytania przy użyciu testu jednostkowego.Urządzenie do testowania jednostek i LiveData
Oto DAO Próbuję testu:
NotificationDao.kt
@Dao
interface NotificationDao {
@Insert
fun insertNotifications(vararg notifications: Notification): List<Long>
@Query("SELECT * FROM notifications")
fun getNotifications(): LiveData<List<Notification>>
}
Jak widać, funkcja kwerenda zwraca LiveData
obiekt, jeśli Zmieniam to na bycie tylko List
, lub w zasadzie cokolwiek otrzymam oczekiwany wynik, który jest danymi wstawionymi do bazy danych.
Problem jest następujący test zawsze niepowodzeniem, ponieważ value
obiektu LiveData
jest zawsze 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
}
Więc pytanie brzmi: Czy ktoś wie lepszego sposobu na przeprowadzanie testów jednostkowych z obiektami LiveData?
Czy jest jakaś aktualizacja w wersji 1.0.0? –