2011-12-11 203 views
8

異步代碼,我想測試一些代碼,依賴於網絡傳輸。代碼發出請求並提供回調 - 請求完成時,回調被觸發。我想嘲笑網絡傳輸,並使用Thread.sleep模擬一些延遲......但當然這會使整個測試暫停。測試使用JUnit

到目前爲止,我已經作出新的線程,使用整個測試CountDownLatch ES從回調發射結束之前停止測試。我的模擬網絡對象創建一個新線程,睡在該線程上,然後觸發回調。這實際上工作得很好,但問題在於,回調中的任何斷言錯誤都不會報告給原始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);