测试RxBinding RxSearchView

时间:2016-07-21 13:42:01

标签: android rx-java android-appcompat searchview rx-android

背景

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转轮和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,那将是很好的,因为我想测试发生什么后发生的事情以及使用正确的输入调用performSearch方法。

1 个答案:

答案 0 :(得分:1)

为了测试RxBindings我只是简单地使用Espresso并将debounce设置为0(去抖时间为公共静态,而在espresso setUp()方法中我将其设置为0)。然后只是

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

只需验证您的Mockito或与throttleLast()运算符类似的内容。

干杯