visible true

技術的なメモを書く

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

参考