पृष्ठभूमिपरीक्षण 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
धावक और 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 विधि सही जानकारी के साथ कहा जाता है कि चाहते हैं बहुत अच्छा होगा।
आप इंस्ट्रूमेंटेशन रजिस्ट्री को कैसे चालू करते हैं? मैं आमतौर पर ऐसा कुछ करता हूं: @Rule सार्वजनिक गतिविधि टेस्टरूल <आपकी सक्रियता> mBaseActivity = new ActivityTestRule <> (YourActivity.class, true, true); और फिर आप SearchView searchView = new SearchView (mBaseActivity.getActivity()) कर सकते हैं; – rxDroid