0

私は自分自身の観測値を実装したり、楽しみや利益のために他の言語から移植したりして遊んでいます。RxJava以外のオブザーバブルまたは非同期コードを一般的にテストするには?

私が遭遇した問題は、オブザーバブルまたは非同期コードを適切にテストする方法に関する情報がほとんどないということです。ストリームが加入されているように、それは最初の値を発する、とすぐ

// Create a stream of values emitted every 100 milliseconds 
// `interval` uses Timer internally 
final Stream<Number> stream = 
    Streams.interval(100).map(number -> number.intValue() * 10); 

ArrayList<Number> expected = new ArrayList<>(); 

expected.add(0); 
expected.add(10); 
expected.add(20); 

IObserver<Number> observer = new IObserver<Number>() { 
    public void next(Number x) { 
    assertEquals(x, expected.get(0)); 
    expected.remove(0); 
    if(expected.size() == 0) { 
     stream.unsubscribe(this); 
    } 
    } 
    public void error(Exception e) {} 
    public void complete() {} 
}; 

stream.subscribe(observer); 

は、次のテストコードを考えます。 onNextが呼び出され、テストが正常に終了します。

JavaScriptでは、今日ほとんどのテストフレームワークは成功/失敗時に非同期に呼び出すことができるテストケースにオプションのPromiseを提供しています。 Javaに似たものはありますか?

答えて

1

実行が非同期なので、終了するまで待つ必要があります。あなただけが観測を使用している場合

your_code 
wait(1000) 
check results. 

それとも、非同期操作を持つか、観察者は、すべてのアイテムを消費するまで、あなたは私たちが待って見ることができます。この例ではTestSubscriber を使用することができ、昔ながらの方法でいくつかの時間を待つことができます。

@Test 
public void testObservableAsync() throws InterruptedException { 
    Subscription subscription = Observable.from(numbers) 
      .doOnNext(increaseTotalItemsEmitted()) 
      .subscribeOn(Schedulers.newThread()) 
      .subscribe(number -> System.out.println("Items emitted:" + total)); 
    System.out.println("I finish before the observable finish. Items emitted:" + total); 


    new TestSubscriber((Observer) subscription) 
      .awaitTerminalEvent(100, TimeUnit.MILLISECONDS); 
} 

あなたがここにhttps://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java

+0

をより多くの非同期の例を見ることができる問題は 'TestSubscriber'私は:( – Mamut

+1

APIをチェックし、のthere'sa請負業者を持っていない可能性がありますRxJava互換' Observer'を期待していることですObservable;を必要としないTestSubscriber;)ので、基本的に待ち時間のようです。 – paul

+0

ありがとうございます!できます :) – Mamut

関連する問題