Sala de pruebas unitarias y LiveData
Actualmente estoy desarrollando una aplicación usando el nuevoComponentes de arquitectura de Android. Específicamente estoy implementando una base de datos de sala que devuelve unLiveData
objeto en una de sus consultas. La inserción y las consultas funcionan como se esperaba, sin embargo, tengo un problema al probar el método de consulta mediante la prueba unitaria.
Aquí está el DAO que estoy tratando de probar:
NotificationDao.kt
@Dao
interface NotificationDao {
@Insert
fun insertNotifications(vararg notifications: Notification): List<Long>
@Query("SELECT * FROM notifications")
fun getNotifications(): LiveData<List<Notification>>
}
Como puede ver, la función de consulta devuelve unLiveData
objeto, si cambio esto para ser solo unList
, Cursor
o básicamente lo que sea, obtengo el resultado esperado, que son los datos insertados en la Base de Datos.
El problema es que la siguiente prueba siempre fallará porque elvalue
delLiveData
el objeto es siemprenull
:
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
}
Entonces la pregunta es:¿Alguien sabe de una mejor manera de realizar pruebas unitarias que involucren objetos LiveData?