2016-04-14 21 views
3

Android'deki RxJava gözcülerim için birim testleri oluşturuyorum.Yeniden denemek için Mockito'da zincirin farklı dönüşü çağrısı

Sahte dönüş değerlerini zincirlemek ve gözlenebilir bir hata/özüm değerlerini simüle etmek istiyorum. Bunu yapmamın

:

when(repository.getObservable()) 
      .thenReturn(Observable.error(new Exception())) 
      .thenReturn(Observable.just(driver)); 

Benim gözlemlenebilir:

return repository.getObservable() 
      .retryWhen(observale -> { 
       return observable 
         .zipWith(Observable.range(1, 3), Pair::create) 
         .flatMap(o -> { 
          if (o.second < count) { 
           return Observable.timer(1000, TimeUnit.MILLISECONDS); 
          } 
          return Observable.error(o.first); 
      }))) 

Ama sadece bile retryWhen yöntem 3+ kez çağırarak, Observable.error(new Exception()) alırlar.

Birisi, retryWhen operatörünü test etmek için farklı bir gözlemlenebilir emisyonun nasıl test edilebileceğini biliyor mu?

Teşekkürler!

+0

Bu blog yayını da (sonunda) bu anlatıyor: https://medium.com/@fabioCollini/testing-asynchronous-rxjava-code-using- Örneğin, böyle bir şey yapabileceğini mockito-8ad831a16877 –

cevap

5

retryWhen(), ikinci kez numaralı telefonu arayamaz. Bunun yerine, ilk kez döndürülmüş olan Observable.error()'u alır ve yeniden gönderir.

retryWhen()'u bu şekilde kullanabilmek için, abone olduğu ilk kez bir hata döndüren ve sonraki aboneliklerde bunu yapmayan tek bir Observable döndürmeniz gerekir.

Observable.defer(new Func0<Observable<String>>() { 
    boolean hasBeenSubscribedTo = false; 

    @Override public Observable<String> call() { 
    if (!hasBeenSubscribedTo) { 
     hasBeenSubscribedTo = true; 
     return Observable.error(new Exception()); 
    } 
    return Observable.just("Hello, world!"); 
    } 
}) 
.retryWhen(/* ...etc... */) 
+0

Harika Daniel! Ertelemeyi kullanmayı denedim ama mantıksal geri dönüş olmadan, iyi yakalama! Çok teşekkürler. –

+0

Ben biraz daha az kod ('Gözlemlenebilir' ile sonuç sarmak zorunda değilsiniz) 'defer' yerine 'fromCallable' kullanın. –

İlgili konular