2016-07-21 55 views
16

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.

+0

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

cevap

1

RxBindings'i test etmek için sadece Espresso'yu kullandım ve debounce'u 0'a ayarlayın (genel statik olarak geri çekme süresi ve espresso setUp() yönteminde 0'a ayarladım). Sonra sadece

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

ve sadece Mockito veya throttleLast() operatör ile benzer ne olursa olsun olun.

Cheers

+0

Yanıt için teşekkürler, BDD'ye geçtiğimde bu yararlıdır, ancak test, SearchView çıkışının DataManager üzerinden bir aramayı tetiklediğini test etmek için JVM'de çalışır. Cevap, testin bir Espresso testi olarak çalışmasına ihtiyaç duyuyor olabilirdi, ancak bu noktada, özellikle bu noktada SearchView'ı önemsemediğimden, bu özel testin JVM'de çalışmasını umuyordum. –

+0

böylece Mockito muhtemelen SearchView ile dalga geçmek için iyi olmayacaktır. PowerMockito veya benzeri bir şey kullanmayı deneyin. Ama bunun etrafta dolaşmak için çok çalışacağına inanıyorum ve SearchView UI'dir, bu yüzden Enstrümantasyon bölümünde test edilmelidir. Ve eğer bir şey yayıldığında test etmek istiyorsanız, sadece kodunuzu test edinSearch and doSomething ve Enstrümantasyon bölümünde sadece bunun tetikleyici olduğunu test edin. Bu şekilde yapılması gereken –