Java 为什么石英示例代码可以';不能在Junit中测试吗?

Java 为什么石英示例代码可以';不能在Junit中测试吗?,java,quartz-scheduler,junit4,Java,Quartz Scheduler,Junit4,我正在运行这个quartz-2.1.0\examples\src\main\java\org\quartz\examples\example3示例代码,它运行得非常好,但是如果我将CronTriggerExample.java中的main代码移动到junit测试类中,作业就不会运行。 下面是quartz示例代码(为了简化,我截断了它们,您可以从quartz网站获得完整的代码) SimpleJob.java: public class SimpleJob implements Job { pr

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

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());
  }
}
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();
    }
}
crontriggereExample.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());
  }
}
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中运行?

要自己看看这个问题,我建议在像Eclipse这样的IDE中以调试模式运行这两段不同的代码

main
中运行这两行时,即使
main
终止,您创建的Quartz调度程序也会继续运行

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

为了让时间触发您的工作,您应该使用以下命令更改JUnit测试

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)
    }
 }

您需要在石英线程运行时阻塞主线程,否则,正如@Kraiss所说,测试几乎会立即终止。要在测试中做任何有用的事情,比如从那些Quartz创建的线程执行断言,您可以使用类似的帮助