Android 房间'的订户;返回Flowable的s DAO方法未通知有关插入实体的信息

Android 房间'的订户;返回Flowable的s DAO方法未通知有关插入实体的信息,android,rx-java2,android-room,Android,Rx Java2,Android Room,我有一个包含一个实体和DAO的房间数据库,它允许插入对象并观察SELECTqueryasFlowable。当我订阅这个Flowable并在数据库中插入一个新对象时,不会得到新的结果 @Database(entities = [User::class], version = 1) abstract class TestDatabase : RoomDatabase() { abstract val dao: UserDao } @Dao interface UserDao { @

我有一个包含一个实体和DAO的房间数据库,它允许插入对象并观察
SELECT
queryas
Flowable
。当我订阅这个
Flowable
并在数据库中插入一个新对象时,不会得到新的结果

@Database(entities = [User::class], version = 1)
abstract class TestDatabase : RoomDatabase() {
    abstract val dao: UserDao
}

@Dao
interface UserDao {
    @Insert
    fun insert(user: User)

    @Query("SELECT * FROM User")
    fun observeUsers(): Flowable<List<User>>
}

@Entity
data class User(@PrimaryKey val id: Int, val name: String)
失败:

java.lang.AssertionError: Expected: [User(id=0, name=George)] (class: SingletonList), Actual: [] (latch = 1, values = 0, errors = 0, completions = 0)
如果在调用
观察者之前完成了插入,则测试通过:

    dao.insert(user)
    dao.observeUsers().test().assertValue(listOf(user))

我做错了什么?

我猜您没有等待足够长的时间来观察插入的结果。如果
insert
在内部是异步的(即使您没有使用rxjavaapi定义它),那么您可能过早地订阅和测试单个值

在断言单个值之前,请尝试使用tester方法(因为您有一个无限的
可流动
,所以
等待终端事件
当然不起作用):

dao.observeuser()
.test()
.waitcount(1,TestWaitStrategy.SLEEP_10MS,5000)
.assertValue(用户列表);

我猜您没有等待足够长的时间来观察插入结果。如果
insert
在内部是异步的(即使您没有使用rxjavaapi定义它),那么您可能过早地订阅和测试单个值

在断言单个值之前,请尝试使用tester方法(因为您有一个无限的
可流动
,所以
等待终端事件
当然不起作用):

dao.observeuser()
.test()
.waitcount(1,TestWaitStrategy.SLEEP_10MS,5000)
.assertValue(用户列表);
    dao.insert(user)
    dao.observeUsers().test().assertValue(listOf(user))