Livedata在junit测试中返回null

问题描述 投票:0回答:1

我有这样的房间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但仍然livesata.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的livingata为null,如何解决这个问题?

android junit android-livedata
1个回答
0
投票

正如@blackbelt在上面的评论中所说,我们需要观察该方法返回的有问题来解决这个问题,这个libray帮助我测试了liveata而没有编写很多样板代码

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

}
© www.soinside.com 2019 - 2024. All rights reserved.