2017-07-06 19 views
1

Retrofit 2、Mockito 1.10、RXJava 1.0を使用しているAndroidアプリケーション用の単体テストを作成しようとしています。私はラムダをサポートするJavaバージョンを使用していません!ユニットテスト:AndroidでRxJavaでObservableを確認する方法

私のコードでは、観測を使用して、私は次の操作を行うことができます

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();

しかし、私はいつ私の 'when'節があるべきか分かりません。私は以下を試しましたが、失敗しました:

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));
 
  

} 

私が本当に追加しなければならないのは、正の状態、つまりonCompletedの点でonErrorと同等のものがあるはずだと思います。同じことをoncompletedで実行した場合、代わりにonCompletedを使用すると、代わりに、私はむしろ混乱していると分かっています。

私は、次のような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を作成する必要があります。

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() 

あなたが出すエラークラスについてもう少し具体的にする必要があるかもしれませんct。 TestSubscriber documentionをチェックしてください。あなたはこのクラスで確認できるたくさんのものがあります。

ハッピーテスト!

+1

1時間で2つの回答:D ありがとうございました:) – greysqrl

2

あなたはObservableをテストするためのクラスTestObserverを使用する必要がありますしません、

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の模擬バージョンを作成する場合は、目的の動作を持つ新しいObservableを作成することができます。例:

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

これは、上記のテストで確認できます。

その後、我々は確認することができ、他の結果

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

をモデル化するための他のモックを作成することができます

@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'をテストしたいと思います。 "公式の"方法は、RxJava 2のために 'TestObserver'を使うことです。あなたは擬似' Observable'をテストに渡すだけです。 – GVillani82

+0

ありがとう...私は今、それを使用できるかどうかを確認しようとしています。コードベースはラムダをサポートしていません。ラムダなしで、あなたが上に示したことをどうすればいいですか? – greysqrl

関連する問題