在我的junit测试期间,ScheduledExecutorService不起作用

时间:2013-09-12 19:08:05

标签: java spring junit scheduledexecutorservice

我正在为我的spring应用程序编写一些junit测试。下面是我的junit测试,它调用实现InitializingBean接口的afterPropertiesSet类的InitializeFramework方法。

下面是我的junit测试调用afterPropertiesSet方法的流程,然后该方法将在同一个类中调用initializeModel方法,然后该方法有一个调用getBundlesInfo的调度程序方法每隔几分钟。但不知怎的,在我的junit期间,getBundlesInfo方法根本没有被调用。

@Test
public void testFramework() {


    try {
        InitializeFramework io = new InitializeFramework();
        io.afterPropertiesSet();

    } catch (Exception e) {

    }
}


public class InitializeFramework implements InitializingBean {

private static long checkWithDBInterval = 1L;

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    @Override
    public void afterPropertiesSet() throws Exception {

        try {

        // other code here

        initializeModel();  
        } catch (Exception e) {

        }
    }

    private void initializeModel() {

        final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(
                new Runnable() {
                    public void run() {
                        try {
                            getBundlesInfo();
                        } catch(Exception ex) {
                            // log exception here
                        }
                    }
                }, 0, checkWithDBInterval, TimeUnit.MINUTES);
    }


    // this method is not getting called from my junit test 
    protected static void getBundlesInfo() {

    // some code here
    // have put the breakpoint here..

    }
}

有人可以帮我这个吗?我在这做什么错?但在我的应用程序运行期间,此流程完全正常并且getBundlesInfo被调用...仅在junit期间它不起作用..

2 个答案:

答案 0 :(得分:2)

这是因为您的单元测试在调度程序执行Runnable之前退出。

您是要测试afterPropertiesSet来电getBundlesInfo还是要测试getBundlesInfo的重复调用?

你的单元如何测试断言getBundlesInfo被调用?或者你不在吗?

如果您只是想看到getBundlesInfo被调用,您可以直接调用它并将调度程序的initialDelay增加到checkWithDBInterval,或者{{1}例如,使用Mockito和/或Powermock使用CountDownLatch进行同步。

好吧或者只是等到调用getBundlesInfo后几秒钟,然后检查是否调用了afterPropertiesSet(你可以用Mockito做btw)。

在任何情况下,您可能希望在测试完成后添加在执行程序服务上调用shutdown的代码


因为你使用Spring:
考虑使用提供的Task Execution and Scheduling框架来安排重复调用getBundlesInfo并让afterPropertiesSet最初直接调用getBundlesInfo。

无论如何,这是一个使用存根并使用CountDownLatch作为等待部分的示例。 我还必须使getBundlesInfo非静态,因为我无法快速记住/找到如何存根静态方法。

getBundlesInfo

答案 1 :(得分:0)

如果您将getBundlesInfo()更改为

,您会注意到
    protected static void getBundlesInfo() {
        System.out.println("ay");
    }

以及您TimeUnit使用的TimeUnit.MILLISECONDS,它将尽可能多地打印。例如,我得到了

ay
ay
ay
ay

这是因为JUnit会在退出之前清除JVM上运行的所有线程。它会杀死/停止/中断它们。