Подписчик метода Room DAO, возвращающий Flowable, не уведомляется о вставленных объектах - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть база данных Room с одной сущностью и DAO, которая позволяет вставлять объекты и наблюдать запрос 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 голосов
/ 17 ноября 2018

Я полагаю, вы не ждете достаточно долго, чтобы увидеть результат вставки.Если insert является внутренним асинхронным (даже если вы не определили его с помощью API RxJava), вы можете подписаться и проверить одно значение слишком рано.

Попробуйте использовать awaitCount метод тестера перед утверждением единственного значения (поскольку у вас есть бесконечное Flowable, поэтому awaitTerminalEvent не работает, конечно):

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