首页 > 解决方案 > Livedata在junit测试中返回null

问题描述

我有这样的 Room 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>)
}

我试图为其中一种方法编写仪器测试并且它总是返回 null,我已将规则设置为 Instanttaskexecutorrule 但仍然 livedata.value 返回 null,下面是我的测试代码

@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() 总是失败,因为来自 dao 的 livedata 为空,如何解决这个问题?

标签: androidjunitandroid-livedata

解决方案


正如@blackbelt在上面的评论中所说,我们需要观察方法返回的livedata来解决问题,这个libray帮助我测试livedata而无需编写大量样板代码

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))

}

推荐阅读