HintergrundTesting 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);
}
Ich versuche, das obige Verfahren unter Verwendung des AndroidJUnit4
Läufer und Mocktio
zu testen.
@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);
}
Das Problem
Ich habe versucht, eine mockSearchView
und eine echte SearchView
verwenden.
mockSearchView = mock(SearchView.class);
searchView = new SearchView(InstrumentationRegistry.getContext(), null);
searchView = new SearchView(InstrumentationRegistry.getTargetContext(), null);
Die realen Objekte führen zu verschiedenen Ausnahmen, wenn der Test während ihrer Instanziierung ausgeführt wird. Das Scheinobjekt scheint während der Ausführung keine Wirkung zu haben.
aktualisieren
Aus Gründen der Klarheit: Im Idealfall wäre es toll, wenn ich die Suche verspotten konnte, wie ich testen wollen, was etwas passiert, nachdem emittiert wird, und dass die performSearch Verfahren mit den richtigen Eingängen aufgerufen wird.
Wie instanziieren Sie InstrumentationRegistry? Normalerweise mache ich so etwas: @Rule public ActivityTestRule mBaseActivity = new ActivityTestRule <> (YourActivity.class, true, true); Und dann können Sie SearchView searchView = neue SearchView (mBaseActivity.getActivity()); –
rxDroid