TestSubscriberを使ってRxJavaのsubscribeのテストを書く
Observableのテストを書く時、以下の様にsubscribeのonNext()等にassertを書きたくなる。だがこれには問題がある。
@Test public void hogeObservableGetNameIsHoge() { //... hogeObservable.subscribe( hoge -> { assertThat(hoge.getName(), is("hoge")); }, e ->{ fail(); } ); }
問題点
onNext()
でassertionがfail()になっても中でcatchされてonError()
にエラーが飛んで来る。で、onError()
でfail()を投げてるとさらにcatchされて死ぬがAssertionErrorではないのでエラーが見づらい。エラーをスルーしてる場合死なずにテストが成功する→アカン
TestSubscriberを使う
RxJavaはテストの為にTestSubscriberクラスを用意している。これを使ってテストをする。TestSubscriberをsubscribe()
に与える事で中で起こった事を記録してくれる。TestSubscriberが記録したものを使ってassertionを行う。
import rx.observers.TestSubscriber; //... @Test public void hogeObservableGetNameIsHoge() { //... TestSubscriber<Hoge> testSubscriber = new TestSubscriber<>(); hogeObservable.subscribe(testSubscriber); testSubscriber.assertNoErrors(); Hoge hoge = testSubscriber.getOnNextEvents().get(0); assertThat(hoge.getName(), is("hoge")); }