2017-07-06 35 views
1

我試圖寫一個Android應用程序的一些單元測試是利用改造2,1.10的Mockito和RXJava 1.0驗證和模擬onCompleted可觀察的RxJava。我沒有使用支持lambdas的java版本!單元測試:如何內的Android

我的代碼使用觀測量,我可以做到以下幾點:

when(myAPI.Complete(anyString(), any(MyContainer.class))) 
     .thenReturn(Observable.<GenericResponse>error(new Throwable("An error has occurred!"))); 

Subscriber genericResponseSubscriber = mock(Subscriber.class); 

myPresenter.myUseCase(id, container, genericResponseSubscriber); 

verify(genericResponseSubscriber, times(1)).onError(any(Throwable.class)); 

上面的代碼工作正常,讓我可以拋出一個錯誤,並在測試中捕捉到它。

我需要什麼,能夠做的一樣好(當然):)是抓住有利條件。我覺得這很明顯,但找不到我需要的答案。

我如何捕獲的onComplete和onNext情況?

我知道了的onComplete驗證會...

驗證(genericResponseSubscriber,時間(1))onCompleted()。

但我不能看到我的「當」條款應該是什麼。我嘗試以下,但失敗:

GenericResponse response = new GenericResponse(); 
response.setSuccess(true); 

when(myAPI.orderComplete(anyString(), any(MyContainer.class))) 
     .thenReturn(Observable.just(response)); 

Subscriber genericResponseSubscriber = mock(Subscriber.class); 

myPresenter.myUseCase(id, container, genericResponseSubscriber); 

verify(genericResponseSubscriber, times(1)).onCompleted(); 

這裏的失敗是subscriber.onStart()代替調用。

所以,我想知道的是,我該如何模擬和驗證'onComplete'和'onNext'的調用,更重要的是我應該能夠自己解決這個問題,而不是問! :)

與往常一樣,任何幫助表示讚賞。

編輯..

我的onError工作測試用例..

public void UseCaseOnError() throws Exception {
   
    String id = "5";
 
   
    order Order = new Order();
   
    SomeContainer myContainer = new SomeContainer(order);
 
   

    when(myRetroFitAPI.complete(anyString(), any(SomeContainer.class))) 

.thenReturn(Observable.error(新的Throwable(「我的錯誤!「)));

 Subscriber genericResponseSubscriber = mock(Subscriber.class);
 
   

    orderPresenter.doUseCase(id, myContainer, genericResponseSubscriber);
 
   

    verify(genericResponseSubscriber,times(1)).onError(any(Throwable.class));
 
  

} 

我應該補充的是,我覺得在onError方面應該有一個相當於onComror的狀態,即onCompleted。如果我這樣做,但是用onCompleted代替,我的驗證失敗,因爲它檢測到o nStart已被調用,而我發現相當混亂。

我已經使用ReplaySubject這樣嘗試:

public void createOrderOnCompleteError() { 
    orderOnCompleteSubject.onError(new Throwable("I am an error")); 
} 

public void createOrderOnCompleteSuccess() { 
    orderOnCompleteSubject.onNext(new GenericResponse().setSuccess(true)); 
    orderOnCompleteSubject.onCompleted(); 
} 

錯誤機制的工作很好..完成機制不...

回答

1

而是嘲諷認購的,你應該RxJava 1創建TestSubscriber:

然後,我們可以模擬其他結果

public Observable<Integer> mockedObservableError() { 
      return Observable.create(e -> { 
       e.onNext(12); 
       e.onError(new Throwable("Generic exception")); 
      }); 
     } 

經查證屬實創建其他模擬

when(myAPI.Complete(anyString(), any(MyContainer.class))) 
     .thenReturn(Observable.<GenericResponse>error(new Throwable("An error has occurred!"))); 

TestSubscriber genericResponseSubscriber = TestSubscriber.create(); 

myPresenter.myUseCase(id, container, genericResponseSubscriber); 

// To check for an error 
genericResponseSubscriber.assertError(Throwable.class) 

// To check for completion 
genericResponseSubscriber.assertCompleted() 

您可能需要更具體一點關於您遇到的錯誤類別克拉。檢查出TestSubscriber documention。有很多東西可以通過這門課來驗證。

快樂測試!

+1

在一個小時內從你的兩個答案:D 非常感謝你:) – greysqrl

2

您應該使用類TestObserver用於測試Observable,以這樣的方式

public Observable<Integer> getObservable() { 
    return Observable.just(12, 20, 330); 
} 

@Test 
public void testObservable() { 
    Observable<Integer> obs = getObservable(); 
    TestObserver<Integer> testObserver = TestObserver.create(); 
    obs.subscribe(testObserver); 

    testObserver.assertComplete(); 
    testObserver.assertResult(12, 20, 330); 
} 

通過這種方式,你可以驗證它完成,然後發出所有預期的項目。

如果你想創建你觀察到的嘲笑版本,你可以創建一個新的Observable有你想要的行爲。例如:

public Observable<Integer> mockedObservableCompleteWithResult() { 
     return Observable.create(e -> { 
      e.onNext(12); 
      e.onNext(20); 
      e.onNext(330); 
      e.onComplete(); 
     }); 
    } 

可以通過上述測試進行驗證。

@Test 
public void testObservable() throws Exception { 
     Observable<Integer> obs = mockedObservableError(); 
     TestObserver<Integer> testObserver = TestObserver.create(); 
     obs.subscribe(testObserver); 

     testObserver.assertError(Throwable.class); 
} 
+0

嗨。感謝您抽出時間回覆..我看不出如何適合我的測試案例(我已經將這添加到了我的問題上面)。它包含了可用的onError測試用例,我需要如何修改這個以使用上面顯示的機制來處理onComplete? – greysqrl

+0

我想我回答了你的問題。我的意思是,你想測試'onComplete'和'onNext'。 「官方」方式是使用'TestObserver'作爲RxJava 2.你只需要將你的模擬'Observable'傳遞給測試。 – GVillani82

+0

謝謝......我想看看我現在能否使用它。儘管代碼庫不支持lambdas。我怎麼能做到你上面沒有lambda表達過的東西? – greysqrl