Тест RxJava2 Flowable Query Room

Я пытался написать модульные тесты для моей базы данных Room, которые я делал в прошлом, когда у меня есть запросы, возвращающие список, и я создаю базу данных, которая позволяет запрашивать основные потоки, но теперь, когда я пытаюсь проверить с помощью Значения RxJava Мне не повезло.

Вот мой код DAO:

@Dao interface AccountDAO { @Query("SELECT * FROM account") fun getAll(): Flowable<List<Account>> @Insert fun insert(accounts: List<Account>): List<Long> //... } 

И вот мой код тестирования базы данных, где я пробовал несколько вещей, чтобы передать его:

 @RunWith(AndroidJUnit4::class) class CCDatabaseTest { //... @JvmField @Rule val mainActivity = ActivityTestRule<MainActivity>(MainActivity::class.java) @Before fun setUp() { val context = mainActivity.activity database = Room.inMemoryDatabaseBuilder(context, CCDatabase::class.java).allowMainThreadQueries().build() accountDao = database.accountDao() transactionDao = database.transactionDao() } //... @Test fun testWriteReadAccount() { val testAccount = Account(TEST_ACCOUNT_NAME, TEST_ACCOUNT_BALANCE) val ids = accountDao.insert(listOf(testAccount)) assertEquals(1, ids.size) val accountsFlowable = accountDao.getAll() val testSubscriber = TestSubscriber<List<Account>>() accountsFlowable.subscribe(testSubscriber) testSubscriber.assertNoErrors() // Fails: testSubscriber.assertValueCount(1) // Fails: testSubscriber.assertValue(listOf(testAccount)) // Fails: testSubscriber.assertResult(listOf(testAccount)) } //... } 

Если кто-нибудь действительно захочет увидеть или протестировать запуск кода, пожалуйста, ознакомьтесь с модулем обновления приложения этого репозитория: https://github.com/adammc331/cashcaretaker

DAO: https://github.com/AdamMc331/CashCareaker/blob/develop/app-refresh/src/main/java/com/adammcneilly/cashcaretaker/daos/AccountDAO.kt

Класс тестирования: https://github.com/AdamMc331/CashCareaker/blob/develop/app-refresh/src/androidTest/java/com/adammcneilly/cashcaretaker/data/CCDatabaseTest.kt

В рамках моего поиска, чтобы ответить на этот вопрос, я прокомментировал средний пост Флорины Мунтенеску, и она ответила ответом.

Мне нужно было включить InstantTaskExecutorRule в свой тестовый класс. Это заменяет исполнятеля фоновой задачи тем, который выполняет все синхронно. Чтобы использовать это, я добавил следующую строку в файл build.gradle моего модуля, обратите внимание, что, хотя мне приходилось исключать определенные модули (у меня возникло несоответствие в поддержке между приложением и тестовым приложением), вы не можете:

 androidTestCompile ("android.arch.core:core-testing:$roomLibraryVersion") { exclude module: 'support-compat' exclude module: 'support-annotations' exclude module: 'support-core-utils' } 

Теперь, с добавленным, мой тестовый класс выглядит следующим образом:

 @RunWith(AndroidJUnit4::class) class CCDatabaseTest { // ... @JvmField @Rule val instantTaskExecutorRule = InstantTaskExecutorRule() @JvmField @Rule val mainActivity = ActivityTestRule<MainActivity>(MainActivity::class.java) @Before fun setUp() { val context = mainActivity.activity database = Room.inMemoryDatabaseBuilder(context, CCDatabase::class.java).allowMainThreadQueries().build() accountDao = database.accountDao() } // ... @Test fun testWriteReadAccount() { val testAccount = Account(TEST_ACCOUNT_NAME, TEST_ACCOUNT_BALANCE) val ids = accountDao.insert(listOf(testAccount)) assertEquals(1, ids.size) accountDao.getAll() .test() .assertValue(listOf(testAccount)) } // ... } 

Попробуйте использовать testObserver.awaitTerminalEvent() перед выполнением своих утверждений.