2016-04-24 12 views
0

ich den Wiederholungs im Code testen wollen:Retry in rxJava

public Observable<Foo> getFoo() { 
     return barService.getBar() 
       .retry(3) 
       .map(barToFoo); 
} 

und die Unit-Test:

//given 
barService = Mockito.mock(BarService.class) 
PublishSubject<Bar> barSubject= PublishSubject.create(); 
when(barService.getBar()).thenReturn(barSubject); 

TestSubscriber<Foo> fooProbe= new TestSubscriber<>(); 
getFoo().subscribe(fooProbe); 

//when 
barSubject.onError(new RuntimeException("bar exception")); 
barSubject.onNext(new Bar()) 

//then 
fooProbe.assertNoErrors(); 
fooProbe.assertValue(new Bar()); 

nicht mit java.lang.AssertionError: Unexpected onError events: 1

+0

Aufruf 'onError' oder' onCompleted' bringt die 'Subject's in einen Endzustand und keine weiteren Ereignisse werden akzeptiert/weitergeleitet. – akarnokd

+0

Verstanden. Was wäre der richtige Ansatz? – Blitzkr1eg

+0

Wenn Sie Ihren Wiederholungsversuch mit einem Fehlerszenario testen möchten, müssen Sie sich überlegen, in welcher Situation Ihr Code onError verursachen und in Ihrem Test ausnutzen könnte. Aber wie sie Ihnen sagen, wird das Thema mit dem Aufruf onError oder OnComplete beendet. – paul

Antwort

0

Aufruf onError oder onCompleted die Subject s bringt in einen Terminal-Zustand und keine weiteren Ereignisse werden akzeptiert/weitergeleitet.

Im Allgemeinen können Sie nicht mit Subject s versuchen Sie, aber Sie können mit fromCallable und einen Zähler versuchen:

AtomicInteger count = new AtomicInteger(); 
Observable<Bar> o = Observable.fromCallable(() -> { 
    if (count.incrementAndGet() >= 3) { 
     return new Bar(); 
    } 
    throw new RuntimeException("bar exception"); 
}); 

when(barService.getBar()).thenReturn(o);