Модульное тестирование LiveData возвращается из Room внутри метода - PullRequest
1 голос
/ 03 мая 2019

У меня есть метод, который получает объект LiveData из слоя DAO в комнате, а затем выполняет некоторые операции над объектом LiveData.

Всякий раз, когда я пытаюсь сделать dataStorage.getAllSections(), он возвращает объект LiveData, и значение всегда равно нулю. (Моя БД предварительно заполнена)

Я объявил правило JUnit для LiveData

@get:Rule
val rule = InstantTaskExecutorRule()

В моем реальном классе, если я создам функцию расширения для ожидания таких данных LiveData, как это,

private fun <T> LiveData<T>.blockingObserve(): T? {
    var value: T? = null
    val latch = CountDownLatch(1)

    val observer = Observer<T> { t ->
        value = t
        latch.countDown()
    }

    observeForever(observer)

    latch.await(2, TimeUnit.SECONDS)
    return value
}

и делай,

dataStorage.getAllSections.blockingObserve()

Модульный тест работает нормально. Я не получаю исключение нулевого указателя. Я даже пытался запустить тест с runBlocking, но это тоже не помогает.

This is my method I am trying to test: 

@VisibleForTesting
fun buildDataFromDB(): LiveData<List<SectionModel>> {

    Logger.d(TAG, "Building data from DB")

    val sections = dataStorage.getAllSections() 
    // sections.value is always null even though my DB is populated 
    sections.value?.forEach { section ->
        // Do something 
        }
    }

    Logger.d(TAG, "Building data from DB completed")

    return sections
}

Это мой тестовый пример:

@Test
fun test_buildDataFromDb() = runBlocking {
    val result = appDataProvider.buildDataFromDB().blockingObserve()
    // asserts
}
...