У меня есть метод, который получает объект 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
}