Joh*_*ohn 9 java junit junit3 timertask
我有一个看起来像这样的函数:
private Timer timer = new Timer();
private void doSomething() {
timer.schedule(new TimerTask() {
public void run() {
doSomethingElse();
}
},
(1000));
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为我的代码编写JUnit测试,并且特别是在测试此代码时,它们的行为并不像预期的那样.通过使用EclEmma,我能够看到我的测试从未触及过该doSomethingElse()功能.
如何在JUnit中编写测试,TimerTask在继续测试之前等待足够长的时间才能完成测试?
你可以这样做:
private Timer timer = new Timer();
private void doSomething() {
final CountDownLatch latch = new CountDownLatch(1);
timer.schedule(new TimerTask() {
public void run() {
doSomethingElse();
latch.countDown();
}
},
(1000));
latch.await();
// check results
}
Run Code Online (Sandbox Code Playgroud)
该CountDownLatch#await()方法将阻塞当前线程,直到countDown()被调用至少在构造中指定的次数,在这种情况下为一次.await()如果要设置等待的最长时间,可以提供参数.
更多信息可以在这里找到:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html
JUnit 并没有真正设置为运行多线程代码。当主线程退出时,它将停止所有其他线程。换句话说,如果您的线程调度程序TimerTask在从您的@Test方法返回之前没有上下文切换到运行新线程的线程,它只会杀死该线程并退出 JVM,因此永远不会执行您的方法。
你可以Thread.sleep(long)像 Stefan 建议的那样放置,或者使用不同的设计,可能是ScheduledThreadPoolExecutor你可以awaitTermination使用一些超时值的地方。
Ste*_*ner -2
Thread.sleep(1000)您可以在测试中使用。
| 归档时间: |
|
| 查看次数: |
6799 次 |
| 最近记录: |