にスローされる例外は以下のコードがクラッシュしないでしょう。しかし、それはアプリで実行中にクラッシュします。コンソールにエラーログが表示されますが、テストは合格とマークされます。RxJava2:JUnitの環境で実行しているときのテスト
@Test
public void test() {
Observable observable = Observable.error(new RuntimeException());
observable.subscribe();
}
したがって、問題は、JUnitでクラッシュさせる方法です。何かがアプリで動作しない場合、それはユニットテストでも:)
を動作しません。また、この例では、私が観察への直接アクセスを持っている場合ええ、それは良いことだから。しかし、私の本当のテストでは、私はそれを持っていません。実際の観測は、テストされているクラスの内部詳細です。私ができることのほとんどは、スケジューラなどを注入することです。
だから、どのように観察に直接アクセスしなくても、それがクラッシュするには?これはRxJava2特定の問題であるakarnokdすることにより
@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();
}
});
}
このような用法は、もはや2.xで同期投げるが、エラーのためのプラグインハンドラで終わるこのコードでスローされなかったかどうかを確認することが可能です。デフォルトでは、ハンドラはスタックトレースを出力します。そのため、コンソールにエラーが表示されるが、テストではエラーは表示されません。それ以外の場合は、StackOverflowErrorなどの致命的な例外のみが伝播します。 – akarnokd
@akarnokdありがとう、それは面白いです、それはRxJava2に固有です。エラーを何らかの形で検出してテストを失敗させる方法はありますか? –
あなたはそれをデザインする必要があります。また、消費者を実際に投げ込むべきではありません。もしそうなら、消費者のonNextまたはlambdaの中の問題のあるコードの周りに自分のtry-catchを使用してください。 – akarnokd