2011-12-11 12 views
8

ネットワーク伝送に依存するいくつかのコードをテストしたいと思います。コードは要求を行い、コールバックを提供します。要求が完了すると、コールバックが起動されます。私はネットワークの送信を模擬したいと思って、いくつかのレイテンシーをシミュレートするためにThread.sleepを使用してください...もちろん、それは全体のテストを一時停止させるでしょう。JUnitでの非同期コードのテスト

これまでは、新しいスレッドを作成していて、コールバックが開始される前にテストが終了するのをテスト中にCountDownLatchを使用して終了しました。私のモックネットワークオブジェクトは、新しいスレッドを作成し、そのスレッドでスリープしてから、コールバックを起動します。実際にはうまくいっていますが、問題はコールバックのアサーションエラーが元のjunitスレッドに報告されないということです。代わりに、コンソール上で例外テキストを取得しています。

は、私は願っていますあります、次のいずれか

  1. パイプへの道assertEqualsメインJUnitの出力コレクタに生成されたスレッドからの出力、または
  2. のJUnitでスレッドコードをテストするための全く異なる、より良い方法、または
  3. シングルスレッドで任意のアイデアについて

感謝を非同期コードをシミュレートするために、いくつかの方法!

+0

なぜQUnitをチェックアウトしません:http://docs.jquery.com/QUnit –

答えて

4

あなたと同様の非同期メカニズムを実装しなければならないときは、テストエラーを保持する抽象クラスAsyncTestCaseを作成し、特別なメソッドwaitForCallback()を用意しました。非同期タスクが期待される結果でエラーを検出すると、エラーをこの変数に入れます。設定者は、waitForCallback()によって使用されるオブジェクトにnotify()を呼び出します。したがって、コールバックが到着するとすぐにテストが起きます。それから非同期タスクによって格納されたものを含むすべてのアサーションを呼び出すことができます。

そして永遠に眠っているからそれらを防ぐために、あなたのテストでタイムアウトを置くことを忘れないでください:あなたが記述している何

@Test(timeout=10000) 
public void mytest() { 
    callAsyncTask(); 
    waitForAsyncTask();  // from base class 
    assertAsyncTaskResult(); // from base class 
} 
+0

ああ、巧妙なアイデア。ありがとう! –

0

ConcurrentUnitです。ここでは例です:

final Waiter waiter = new Waiter(); 

    new Thread(() -> { 
    doSomeWork(); 
    waiter.assertTrue(true); 
    waiter.resume(); 
    }).start(); 

    // Wait for resume() to be called 
    waiter.await(1000); 
関連する問題