使用JUnit时运行TimerTask

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在继续测试之前等待足够长的时间才能完成测试?

Ctr*_*rlF 7

你可以这样做:

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


Sot*_*lis 5

JUnit 并没有真正设置为运行多线程代码。当主线程退出时,它将停止所有其他线程。换句话说,如果您的线程调度程序TimerTask在从您的@Test方法返回之前没有上下文切换到运行新线程的线程,它只会杀死该线程并退出 JVM,因此永远不会执行您的方法。

你可以Thread.sleep(long)像 Stefan 建议的那样放置,或者使用不同的设计,可能是ScheduledThreadPoolExecutor你可以awaitTermination使用一些超时值的地方。


Ste*_*ner -2

Thread.sleep(1000)您可以在测试中使用。

  • 最好的测试是快速测试,不依赖于实时。当您有很多测试时,如果您使用实时测试,则使用睡眠的测试将花费太长时间。 (3认同)