我有一个包含一个实体和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))
我在做什么错了?
答案 0 :(得分:1)
我想您没有等很长时间才能观察到插入的结果。如果insert
在内部是异步的(即使您没有使用RxJava API对其进行定义),则可能为时过早订购和测试单个值。
在声明单个值之前尝试使用awaitCount
测试方法(因为您拥有无限的Flowable
,因此awaitTerminalEvent
当然不起作用):
dao.observeUsers()
.test()
.awaitCount(1, TestWaitStrategy.SLEEP_10MS, 5000)
.assertValue(listOf(user));