2016-12-20 8 views
1

にスローされる例外は以下のコードがクラッシュしないでしょう。しかし、それはアプリで実行中にクラッシュします。コンソールにエラーログが表示されますが、テストは合格とマークされます。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

このような用法は、もはや2.xで同期投げるが、エラーのためのプラグインハンドラで終わるこのコードでスローされなかったかどうかを確認することが可能です。デフォルトでは、ハンドラはスタックトレースを出力します。そのため、コンソールにエラーが表示されるが、テストではエラーは表示されません。それ以外の場合は、StackOverflowErrorなどの致命的な例外のみが伝播します。 – akarnokd

+0

@akarnokdありがとう、それは面白いです、それはRxJava2に固有です。エラーを何らかの形で検出してテストを失敗させる方法はありますか? –

+2

あなたはそれをデザインする必要があります。また、消費者を実際に投げ込むべきではありません。もしそうなら、消費者のonNextまたはlambdaの中の問題のあるコードの周りに自分のtry-catchを使用してください。 – akarnokd

答えて

3

はまた、私はこのコードはいずれもクラッシュしませんチェックしました。

「このような用法は、もはや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; 
} 
0

使用TestSubscriber

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

    observable.subscribe(testSubscriber); 

    testSubscriber.assertTerminalEvent(); 
    testSubscriber.assertError(RuntimeException.class); 
+0

よさそうだが、残念ながら私が観測へのアクセスを持っていないし、私の本当のテストに()の呼び出しを購読します。私はobservablesをテストしていない、私はobservablesで構成されるコンポーネントをテストしています。 –

+0

そして、私は実際のサブスクライバのコードがうまく動作することをテストしたいので、TestSubscriberに置き換えるだけでその目的を破ることができます。 –

+0

なぜクラスの内部の詳細をテストしたいですか?クラスのパブリックインターフェイスのみをテストする必要があります。 –

関連する問題