Тестирование 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()
.
Приветствия