Livedata, возвращающие нуль в тесте junit - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть мой класс DAO для комнат, подобный этому

@Dao
interface SourceDao {

    @Query("SELECT * FROM source_table")
    fun getAllSourceItems(): LiveData<List<Source>>

    @Query("SELECT * FROM source_table WHERE sourceType = :filterType")
    fun filterSourceItems(filterType:Int): LiveData<List<Source>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertSource(source: Source)

    @Delete
    fun deleteSource(source: Source)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAllSources(sourceList:List<Source>)
}

Я пытался написать инструментальный тест для одного из методов, и он всегда возвращал ноль, я установил правило как Instanttaskexecutorrule, но все еще жилые данные.значение возвращает ноль, ниже мой тестовый код

@RunWith(AndroidJUnit4::class)
class CreateSourceInstrumentationTest {


    private lateinit var db:AppDatabase

    @get:Rule
    var rule = InstantTaskExecutorRule()


    @Before
    fun createDbConnection() {
        val context = ApplicationProvider.getApplicationContext<Context>()
        db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
    }


    @Test
    fun getAllSourceCategoryItems() {
        // test insert a source item

        val testSource = Source("foo", 1)
        db.sourceDao().insertSource(testSource)
        Assert.assertEquals(listOf(testSource), db.sourceDao().getAllSourceItems().value)
    }


    @After
    fun closeDb() {
        db.close()
    }
}

getAllSourceCategoryItems () всегда терпит неудачу, так как livingata из dao равен null, как это исправить?

1 Ответ

0 голосов
/ 26 апреля 2019

Как сказал @blackbelt в вышеприведенном комментарии, для решения проблемы нам нужно наблюдать живые данные, возвращаемые методом, этот libray помог мне протестировать живые данные без написания большого количества кода базовой платы

https://github.com/jraska/livedata-testing

Я изменил свой тест следующим образом

@Test
fun getAllSourceCategoryItems() {
    // test insert a source item

    val testSource = Source("foo", 1)
    db.sourceDao().insertSource(testSource)
    val livedata =  db.sourceDao().getAllSourceItems()
    livedata.test().assertValue(listOf(testSource))

}
...