2011-09-27 51 views
0

我在單元測試中遇到以下問題。與測試類:從計時器設置本地字段

class TestClass { 
    boolean stopTest = false; 

    @Test 
    public void test() { 
     // do something 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      public void run() { 
       stopTest = true; 
      } 
     }, 1200); 
     while(!stopTest) { 
     } 
     timer.cancel(); 
     // do assert 
    } 
} 

本試驗作品的權利只有在與運營商的同時斷點調試,但如果我在調試或無斷點運行試驗不是,他的作品無限。我試圖用布爾字段將stopTest更改爲類,並嘗試通過此類中的get和set方法。我做錯了什麼?

回答

0

您需要使用volatile修正因併發,否則stopTest不能可靠地更新和閱讀。有關更多信息,請參閱JLS §8.3.1.4 - volatile Fields

volatile boolean stopTest = false; 
+0

非常感謝您! – Mirimon

0

@JRL和@mrkhrts是正確的。但我想提出其他建議。

你真的不需要計時器在這裏。你只是想在分離線程中運行一些代碼,並讓你的主線程等待,直到這個異步任務完成。不要使用簡單的線程和join()方法是:

@Test 
public void test() { 
    // do something 
    Thread t = new Thread() { 
     public void run() { 
      try {Thread.sleep(1200)} catch(InterruptedException e) {} 
      // do what you want here 
     } 
    } 
    t.start(); 

    t.join(); // this line will be bloked until the async task is done. 
} 
+0

計時器對我來說更合適,因爲我也想在計時器的計時器上檢查我的對象。我沒有寫,因爲我試圖改變這個測試很多。謝謝! – Mirimon