2013-04-28 84 views
4

我正在运行这个quartz-2.1.0\examples\src\main\java\org\quartz\examples\example3示例代码,它运行得非常好,但是如果我将代码在CronTriggerExample.java中移动到junit测试类中,则该作业不会运行。 以下是石英示例代码(我为了简化而截断它们,您可以从石英网站获取完整代码)。为什么石英示例代码不能在Junit中测试?

SimpleJob.java:

public class SimpleJob implements Job { 
    private static Logger _log = LoggerFactory.getLogger(SimpleJob.class); 

    public void execute(JobExecutionContext context) throws JobExecutionException { 
    JobKey jobKey = context.getJobDetail().getKey(); 
    _log.info("SimpleJob says: " + jobKey + " executing at " + new Date()); 
    } 
} 

CronTriggerExample.java:

public class CronTriggerExample { 
    public void run() throws Exception { 
     Logger log = LoggerFactory.getLogger(CronTriggerExample.class); 
     SchedulerFactory sf = new StdSchedulerFactory(); 
     Scheduler sched = sf.getScheduler(); 
     JobDetail job = newJob(SimpleJob.class) 
      .withIdentity("job1", "group1") 
      .build(); 
     CronTrigger trigger = newTrigger() 
      .withIdentity("trigger1", "group1") 
      .withSchedule(cronSchedule("0/3 * * * * ?")) 
      .build(); 

     Date ft = sched.scheduleJob(job, trigger); 
     log.info(job.getKey() + " has been scheduled to run at: " + ft 
      + " and repeat based on expression: " 
      + trigger.getCronExpression()); 

     sched.start(); 
    } 

    public static void main(String[] args) throws Exception { 
     CronTriggerExample example = new CronTriggerExample(); 
     example.run(); 
    } 
} 

上面的代码运行良好,如果我在main方法移动至两行代码到一个JUnit测试类(junit4),如下所示:

public class Test1 { 
    @Test 
    public void run() throws Exception { 
     CronTriggerExample example = new CronTriggerExample(); 
     example.run(); 
    } 
} 

该作业无法运行。

我很困惑为什么相同的代码不能在junit中运行?

回答

0

要亲自看到问题,我建议在调试模式下运行这两个不同的代码片段,如IDE的IDE。

当您在main中运行这两行时,即使main终止,您创建的Quartz Scheduler也会继续运行。

当您在JUnit中运行这两行时,JUnit框架在所有单元测试终止时会终止所有剩余的线程。

为了让时间来石英触发你的工作,你应该改变你的JUnit测试的follwing

public class Test1 { 
    @Test 
    public void run() throws Exception { 
     CronTriggerExample example = new CronTriggerExample(); 
     example.run(); 

     Thread.sleep(240000); // Sleep 4 minutes (4*60*1.000 = 240.000) 
    } 
} 
0

你需要阻塞主线程,而石英线程运行,否则,作为@Kraiss说,测试将立即死亡。为了在你的测试中做任何有用的事情,比如从Quartz创建的线程执行断言,你可以使用类似ConcurrentUnit的东西来提供帮助。

相关问题