2016-04-26 1 views
0

に、私はユースケースオブジェクトをテストしたい、この特定のケースでは、このようになりますLoginUseCaseが、そこにある:UntTest - モックRxJavaオブジェクトユースケースオブジェクト

public class LoginUseCase implements RxUseCase<AuthResponse, AuthCredentials> { 

    ApiManager mApiManager; 

    public LoginUseCase(ApiManager apiManager) { 
     mApiManager =apiManager; 
    } 

    @Override 
    public Observable<AuthResponse> execute(final AuthCredentials authCredentials) { 
     return Observable.just(1) 
       .delay(750, TimeUnit.MILLISECONDS) 
       .flatMap(l -> mApiManager.login(authCredentials.getLogin(), authCredentials.getPassword())); 
    } 
} 

私は簡単なテストを書いた:

@RunWith(MockitoJUnitRunner.class) 
public class LoginUseCaseTest { 

    private LoginUseCase mLoginUseCase; 
    @Mock ApiManager mApiManager; 

    @Before 
    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     mLoginUseCase = new LoginUseCase(mApiManager); 
    } 


    @Test 
    public void testShouldThrowsError() throws Exception { 
     TestSubscriber<AuthResponse> testSubscriber = new TestSubscriber<>(); 
     doReturn(Observable.error(new Throwable())).when(mApiManager).login("", ""); 
     mLoginUseCase 
      .execute(new AuthCredentials("", "")) 
      .subscribe(testSubscriber); 
     testSubscriber.assertNoErrors(); 

    } 
} 

しかし、このテストはいつも通り、この場合モックエラーがどのように観測されるのか分かりません。

EDIT:私はskinnyJに従ってtestShouldThrowsError()を変更しましたが、まだテストは合格していますか?

+0

ここでは遅延が必要な理由は分かりますが、ちょうど+ delayの代わりにhttp://reactivex.io/documentation/operators/timer.html演算子を使用すると短くなります。 – marwinXXII

答えて

1

アサーションの前に、テストサブスクライバにawaitTerminalEvent()と電話する必要があります。 これで、Schedulers.computationで実行する遅延をスケジュールし、observableの完了前にテストメソッドが正常に完了するようになったためです。

代わりの方法としては、executeメソッドの引数としてスケジューラを渡すか、またはスケジューラをあなたのユースケースに格納することです。これにより、テスト中にSchedulers.immediate()を渡すことができ、テストは現在のスレッドで実行されます(指定された遅延の実行をブロックします)。

最後のアプローチは、toBlocking()を観測可能に呼び出すことですが、私は、通過スケジューラが好ましい選択だと考えています。現在の観測値にこの演算子を追加する方法はありません。