2011-09-27 50 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