testingRxBinding 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亚军和Mocktiotesting上述方法。

 @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); 

在实例化过程中,真实对象会导致不同的exception。 模拟对象在执行过程中似乎没有效果。

更新

为了清楚起见:理想情况下,如果我可以嘲笑SearchView,因为我想testing发生什么后发生什么事情,并执行performSearch方法是正确的input。

Solutions Collecting From Web of "testingRxBinding RxSearchView"

对于testingRxBindings,我只是简单地使用Espresso,并将debounce设置为0(反弹时间为公共静态,而在espresso setUp()方法中,我将其设置为0)。 然后就是

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

只需validation你的Mockito或与throttleLast()运算符类似。

干杯