2

以下のコードは、JUnit 環境で実行してもクラッシュしません。しかし、アプリで実行するとクラッシュします。コンソールにエラー ログが表示されますが、テストは合格としてマークされています。

  @Test
  public void test() {
    Observable observable = Observable.error(new RuntimeException());
    observable.subscribe();
  }

問題は、JUnit でクラッシュさせる方法です。ええ、アプリで何かが機能しない場合、単体テストでも機能しないのは良いことです:)

この例では、オブザーバブルに直接アクセスできます。しかし、私の実際のテストでは、それはありません。実際のオブザーバブルは、テストされるクラスの内部の詳細にすぎません。私ができることのほとんどは、スケジューラまたは何かを注入することです。

では、オブザーバブルに直接アクセスせずにクラッシュさせる方法は?

また、このコードもクラッシュしないことを確認しました。

  @Test
  public void test() {
    Observable observable = Observable.error(new RuntimeException());
    observable.subscribe(new Consumer() {
      @Override
      public void accept(Object o) throws Exception {
        throw new RuntimeException();
      }
    }, new Consumer<Throwable>() {
      @Override
      public void accept(Throwable throwable) throws Exception {
        throw new RuntimeException();
      }
    });
  }
4

3 に答える 3

6

akarnokd によると、これは RxJava2 固有の問題です。

「このような使用法は、2.x では同期的にスローされなくなりましたが、プラグイン ハンドラーでエラーが発生します。」

このコードでエラーがスローされたかどうかを確認することができます

public static List<Throwable> trackPluginErrors() {
    final List<Throwable> list = Collections.synchronizedList(new ArrayList<Throwable>());

    RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
        @Override
        public void accept(Throwable t) {
            list.add(t);
        }
    });

    return list;
}
于 2016-12-20T14:03:04.350 に答える
1

TestSubscriberを使用する

    Observable observable = Observable.error(new RuntimeException());
    TestSubscriber testSubscriber = TestSubscriber.create();

    observable.subscribe(testSubscriber);

    testSubscriber.assertTerminalEvent();
    testSubscriber.assertError(RuntimeException.class);
于 2016-12-20T10:25:48.937 に答える