android - 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 为空,如何解决这个问题?
解决方案
正如@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))
}
推荐阅读
- python - 如何在函数之间传递参数?
- aspose - 如何让 Aspose.Cells 19.10 在 Linux .Net 服务中正确渲染字体?
- r - R粘贴列表绑定
- netbeans - JFreeChart 不能处理可执行的 JAR 文件?
- html - CSS 选择器 QuerySelector 替代
- node.js - 使用 BATCH 文件在受密码保护的文件夹中调用 NodeJS 脚本
- python - 从字符串中提取数组
- xaml - Xamarin 表单用户界面不会更新以反映 Android 上的 XAML 更改
- wordpress - woocommerce 订单在数据库中,但不在仪表板中,不在订单导出中
- python - 正则表达式 - 仅在数字之后和括号之前获取字符串(例如 1.Manhattan (NY))