Тестирование RxBinding RxSearchView

Фон

public Observable<List<Foo>> search(SearchView searchView) {

    return RxSearchView.queryTextChanges(searchView)
            .filter(charSequence -> !TextUtils.isEmpty(charSequence))
            .throttleLast(100, TimeUnit.MILLISECONDS)
            .debounce(200, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(AndroidSchedulers.mainThread())
            .flatMap(this::performSearch) //Search the DB
            .onErrorResumeNext(this::doSomething);
}

Я пытаюсь протестировать вышеуказанный метод с помощью AndroidJUnit4 runner и Mocktio.

@Test
public void testSearchCallsDataManager_WhenCalled() {

    String input = "abc";

    when(mockSearchView.getQuery()).thenReturn(input);

    searchRequestManager.search(mockSearchView).subscribe(testSubscriber); //Using standard TestSubscriber

    testSubscriber.assertNoErrors();
    testSubscriber.assertNotCompleted();
    verify(mockDataManager).getFoos(input);
}

Проблема

Я пробовал использовать mockSearchView и реальный SearchView.

mockSearchView = mock(SearchView.class);
searchView = new SearchView(InstrumentationRegistry.getContext(), null);
searchView = new SearchView(InstrumentationRegistry.getTargetContext(), null);

Реальные объекты приводят к различным исключениям при запуске теста во время их создания. Кажется, что макет объекта не влияет на выполнение.

Обновление

Для ясности: В идеале было бы здорово, если бы я мог издеваться над SearchView, поскольку я хочу проверить, что происходит после того, как что-то испускается и что метод executeSearch вызывается с правильными входами.

Ответы

Ответ 1

Для тестирования RxBindings я просто использовал Espresso и установил debounce в 0 (время debounce как public static, а в espresso setUp() метод я установил его до 0). Тогда просто

onView(withId(yourId)).perform(ViewActions.replaceText(to something))  

и просто проверьте свой Mockito или что-то подобное с оператором throttleLast().

Приветствия