Ben AndroidJUnit4
koşucusu ve Mocktio
kullanarak yukarıdaki yöntemi sınamak çalışıyorumTest 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);
}
Arkaplan.
@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);
}
Sorun
Ben mockSearchView
ve gerçek bir SearchView
kullanarak çalıştılar.
mockSearchView = mock(SearchView.class);
searchView = new SearchView(InstrumentationRegistry.getContext(), null);
searchView = new SearchView(InstrumentationRegistry.getTargetContext(), null);
Gerçek nesneler, örnekleme sırasında, test çalışırken farklı istisnalarla sonuçlanır. Sahte nesnenin yürütme sırasında hiçbir etkisi yoktur.
Güncelleme Anlaşılır olması için
: Bir şeyin yaydığı SONRA neler ve performSearch yöntemi doğru giriş ile çağrılmasını test etmek istediğiniz gibi SearchView alay eğer İdeal harika olurdu.
InstrumentationRegistry nasıl oluşturulur? Genellikle böyle bir şey yapıyorum: @Rule public ActivityTestRule mBaseActivity = new ActivityTestRule <> (YourActivity.class, true, true); Ve sonra SearchView searchView = new SearchView (mBaseActivity.getActivity()); –
rxDroid