我正在为我的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期间它不起作用..
答案 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上运行的所有线程。它会杀死/停止/中断它们。