我有这样的房间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,如何解决这个问题?
正如@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))
}