【发布时间】:2016-11-25 03:32:38
【问题描述】:
背景
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 会很棒,因为我想测试在发出某些东西之后会发生什么,并且使用正确的输入调用 performSearch 方法。
【问题讨论】:
-
如何实例化 InstrumentationRegistry?我通常会这样做:@Rule public ActivityTestRule
mBaseActivity = new ActivityTestRule(YourActivity.class, true, true);然后你可以做 SearchView searchView = new SearchView(mBaseActivity.getActivity());
标签: android rx-java android-appcompat searchview rx-android