使用线程进行JUnit测试 - 测试执行程序行为

时间:2013-11-26 10:16:36

标签: java multithreading junit

考虑这个测试类,如果运行main方法,该过程将在5分钟内完成,如果运行测试则立即成功。是否有任何建议的方法来验证Executor行为?我希望测试也不会在5分钟内完成。

我遇到的具体问题是,创建ScheduledExecutorServiceExecutors.html#newScheduledThreadPool(int),安排未来然后取消该未来不会终止基础Executor作为默认RemoveOnCancelPolicy是等待在终止之前安排取消的未来。我正在通过暴露正在使用的ScheduledThreadPoolExecutor来解决这个问题,但我更愿意将其封装在我的实现中。

public class TestExecutor {

    @Test public void executorThatIsNotShutdown() {
        main(null);
    }

    public static void main(final String[] args) {
        final ScheduledExecutorService ex = Executors.newScheduledThreadPool(1);
        ex.schedule(new Runnable() {
            @Override
            public void run() {
            }
        }, 5, TimeUnit.MINUTES);
        ex.shutdown();
        System.out.println(ex.toString());
    }
}

2 个答案:

答案 0 :(得分:2)

在测试方法中提交/安排任务后尝试使用此代码:

executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.MINUTES);

因此测试线程将被阻止,直到所有任务都完成执行或发生超时

答案 1 :(得分:0)

您需要添加以下代码以使主线程等待一段时间,直到您的Executorsthread完成其操作

public static void main(final String[] args) {
    final ScheduledExecutorService ex = Executors.newScheduledThreadPool(1);
    ex.schedule(new Runnable() {
        @Override
        public void run() {
        }
    }, 5, TimeUnit.MINUTES);
    System.out.println(ex.toString());
   Thread.sleep('enter the time duration , so that your executor will finish its operation');
}

编辑: - 你可以尝试替代方式。 我有同样的问题,我在实际的测试方法之前放了thread.sleep()

@Before (method)
Thread.sleep(mill secs);