2016-10-18 18 views
1

TestSubscriberのようなものがあります。それは、awaitTerminalEvent()getOnNextEvents()のように非常に便利な機能を持っているなどRxJavaテスト可読

シーケンスの途中でいくつかの観察可能に固定されることがありますObservableためTestSubscriberの同等はありますか?

私はそのうちの1つは、いくつかの具体的な例をテストしたいと思います:

  • 私はコンストラクタでObservableを受け入れるクラスを持っています。そのうちの1つはObservableの中にonErrorResumeNextオペレータを呼び出すメソッドです。したがって、特定の条件下でメインObservableを実行すると、テスト済みのObservableが呼び出される可能性があります。 assertExecutedのようなものが必要です。

  • 上記の場合、ThreadObservableが実行されていることをテストしたいと思います。

  • 私が知りたいのは、Observableが入力に基づいて返されたものです。すでに利用可能な良い方法がない場合にはクリーナーの上に呼び出しを行う方法、

    observable 
        .doOnNext(o -> { 
         // Observable was given a value 
        }); 
    

これらの例はそれぞれのような回避策が必要?

答えて

1

アサーションはラムダ自体が実行されない可能性があるため(あなたのonErrorResumeNextの場合のように)、観察可能な部分のラムダの外側でテストする必要があります。したがって、私たちがテストしたい結果を運ぶためには、オブザーバブルの外で定義されたオブジェクトが必要です。

AtomicBoolean executed = new AtomicBoolean(false); 
Observable 
    .empty() 
    .doOnNext(t -> executed.set(true)) 
    .subscribe(); 
assertFalse(executed.get()); 

この例では、より良いTestSubscriberで行うことができるが、それは技術を示しています

の試験観測のための一般的な手法は、イベントを記録するアトミックオブジェクトを使用することです。 `Atomic`オブジェクトを指摘して

AtomicBoolean executed = new AtomicBoolean(false); 
Observable 
    .empty() 
    .doOnNext(Actions.setToTrue(executed)) 
    .subscribe(); 
assertFalse(executed.get()); 
+0

ありがとう:

rxjava-extrasは、Java 6を(一体だけretrolambdaを使用)を使用すると、このユースケースのための匿名クラスを記述する必要がないように使用している場合に便利なクラスを持っていますjava.util.concurrent'パッケージから取得します。だから私がうまくいっていないと、観察された観察可能なものは 'ラップされ 'なければなりません。ご回答いただきありがとうございます。 –