Поведение RxJava Schedulers.immediate () во время модульного тестирования

Я пытаюсь написать тест для моего объекта DAO, который использует реактивный интерфейс. У меня есть таблица с рецептами, и я хочу проверить, что, когда я вставляю данные в эту таблицу, абонент получает список с рецептами.

Я использую класс TestSubscriber и выполняю утверждения в этом классе. Мой простой тест выглядит так:

@Test fun testSubscriber() { insertItem() val testSubscriber = TestSubscriber.create<List<Recipe>>() recipeDao .getRecipes() .subscribeOn(Schedulers.immediate()) .subscribe(testSubscriber) testSubscriber.assertNoErrors() testSubscriber.assertNoTerminalEvent() testSubscriber.assertNotCompleted() testSubscriber.assertValueCount(1) assertEquals(1, testSubscriber.onNextEvents[0].size) } 

Проблема заключается в том, что утверждение testSubscriber.assertValueCount(1) терпит неудачу, потому что ни один элемент не был испущен. Но когда я вставляю эту строку выше testSubscriber.awaitTerminalEvent(500, TimeUnit.MILLISECONDS) , тест проходит успешно. Мое наблюдаемое не излучает терминальное событие, и поэтому выполняется тайм-аут, но тем временем ожидания, onNext вызывался со списком рецептов.

Мой метод getRecipes:

 fun getRecipes(): Observable<List<Recipe>> { return query(SELECT("*") .FROM(Recipe.TABLE_NAME) .ORDER_BY(Recipe.COL_NAME)) .run() .mapToList(RecipeMapper.MAPPER) } 

Как это возможно? Я думал, что когда я использую Schedulers.immediate (), операция будет выполняться в том же потоке, и мой TestSubscriber получит события. Если нет, как мне написать этот тест, чтобы он преуспел? Я хочу проверить, что вызвано onNext, и я не хочу вставлять искусственные команды сна между ними.

    Проблема заключалась в том, что я использовал библиотеку SqlBrite с дополнительной структурой SqlBrite-Dao. SqlBrite наблюдает за запросом на конкретный планировщик, и когда ни один не был предоставлен DaoManager из SqlBrite-Dao, использовался Schedulers.io (). Решение состоит в том, чтобы предоставить планировщику DaoManager.Builder или применить RxJavaPlugins и вернуть Schedulers.immediate () как все планировщики.