Room的DAO方法的订户返回Flowable不会收到有关插入实体的通知

时间:2018-11-16 21:25:15

标签: android rx-java2 android-room

我有一个包含一个实体和DAO的Room数据库,该数据库允许插入对象并以SELECT的形式观察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)

测试失败:

@RunWith(AndroidJUnit4::class)
class ObserveUsersTest {

    @Test
    fun observeUsersTest() {
        val db = Room.inMemoryDatabaseBuilder(
            InstrumentationRegistry.getContext(), TestDatabase::class.java
        ).build()
        val dao = db.dao
        val user = User(0, "George")
        val test = dao.observeUsers().test()

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

        db.close()
    }
}

失败:

java.lang.AssertionError: Expected: [User(id=0, name=George)] (class: SingletonList), Actual: [] (latch = 1, values = 0, errors = 0, completions = 0)

如果在调用observeUsers之前插入已完成,则测试通过:

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

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我想您没有等很长时间才能观察到插入的结果。如果insert在内部是异步的(即使您没有使用RxJava API对其进行定义),则可能为时过早订购和测试单个值。

在声明单个值之前尝试使用awaitCount测试方法(因为您拥有无限的Flowable,因此awaitTerminalEvent当然不起作用):

dao.observeUsers()
.test()
.awaitCount(1, TestWaitStrategy.SLEEP_10MS, 5000)
.assertValue(listOf(user));