当前位置: 首页 > 面试题库 >

Testing @Scheduled in spring

段干兴业
2023-03-14
问题内容

Spring提供了使用注释按特定间隔计划和执行任务的可能性,例如 @Scheduled

有一种方便的方法来对该行为进行单元测试吗?

当然,我可以自己调用bean的方法,但是我想确保不会因配置错误等而遇到诸如多次执行之类的问题。

其他框架提供了自己快进时间的可能性。Activiti就是一个例子,你可以在其中致电

org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date)

加快框架使用的时间。

春天有什么可比的吗?

本质上,我想做的是在单元测试(使用来运行SpringJUnit4ClassRunner)中执行以下操作

@Test public void testTaskScheduling() {

  assertThat(someOtherBean.getSomeProperty(), is(equalTo(whatIinitiallyExpect)));

  SpringClockUtil.setDate(dateInTwoHours)// This is what I am missing
  SpringTaskExecutor.executeAllScheduledTasks() // Also missing

  assertThat(someOtherBean.getSomeProperty(), is(equalTo(whatIexpectNow)));
}

问题答案:

你可以使用常规的JUnit测试实际的方法执行,但是@Scheduled(cron = "0 * * * * *")可以使用以下命令测试你指定的方法是否正确:

@Test
public void testScheduler(){
    // to test if a cron expression runs only from Monday to Friday
    org.springframework.scheduling.support.CronTrigger trigger = 
                                      new CronTrigger("0 0 1 * * MON-FRI");
    Calendar today = Calendar.getInstance();
    today.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);

    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss EEEE"); 
    final Date yesterday = today.getTime();
    log.info("Yesterday was : " + df.format(yesterday));
    Date nextExecutionTime = trigger.nextExecutionTime(
        new TriggerContext() {

            @Override
            public Date lastScheduledExecutionTime() {
                return yesterday;
            }

            @Override
            public Date lastActualExecutionTime() {
                return yesterday;
            }

            @Override
            public Date lastCompletionTime() {
                return yesterday;
            }
        });

    String message = "Next Execution date: " + df.format(nextExecutionTime);
    log.info(message);

}

这是输出:

Yesterday was : 2019/11/06 11:41:58 Friday

Next Execution date: 2019/11/09 01:00:00 Monday

由于最后一次执行(在中设置TriggerContext)是星期五,因此下一次执行将在下一个星期一。

我对Spring api有所了解,并且找到了这个解决方案,希望它对我有所帮助。



 类似资料:
  • Testing in browser Testing with NPM (CLI) Testing in browser To run the Jasmine tests in your browser, go to the following pages: <YOUR_LOCALHOST_ADDRESS>/test/E2ERunner.html - Handsontable end-to-end

  • import "testing" testing 提供对 Go 包的自动化测试的支持。通过 `go test` 命令,能够自动执行如下形式的任何函数: func TestXxx(*testing.T) 其中 Xxx 可以是任何字母数字字符串(但第一个字母不能是 [a-z]),用于识别测试例程。 在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。 要编写一个新的测试套件,需要创

  • 为你的应用编写测试是一个参与的过程。Play为你提供了一个默认的测试框架,并提供了帮助器和应用存根使测试你的应用尽可能的简单。 概述 测试文件的位置在”test”文件夹中。这里有两个简单的测试文件其可以被用作为模板。 你可以从Play控制台运行测试。 点击test来按钮运行所有测试。 点击标注测试类名字比如:test-only my.namespace.MySpec的test-only按钮来运行一

  • 第一章“图层树”证实了最好使用图层相关视图,而不是创建独立的图层关系。其中一个原因就是要处理额外复杂的触摸事件。 CALayer并不关心任何响应链事件,所以不能直接处理触摸事件或者手势。但是它有一系列的方法帮你处理事件:-containsPoint:和-hitTest:。 -containsPoint:接受一个在本图层坐标系下的CGPoint,如果这个点在图层frame范围内就返回YES。如清单3

  • 每当你想要确保你的UI不会有意外的改变,快照测试是非常有用的工具。 A typical snapshot test case for a mobile app renders a UI component, takes a snapshot, then compares it to a reference snapshot file stored alongside the test. The t

  • 在本章中,我们将测试在Hello World示例章节中创建的示例项目,以演示Spring CLI的测试功能。 按照下表中列出的步骤测试示例项目 - Sr.No 步骤和说明 1 在Test文件夹中创建FirstApplication.groovy和TestFirstApplication.groovy ,如下所述。 2 编译并运行应用程序以验证实现的逻辑的结果。 FirstApplication/F

  • 基于Linux的配置检查工具,采用插件式结构开发。开发语言使用的是python.开发者可以通过自行开发插件来扩展该工具,灵活性高。开发该工具的主要目的是因为刚入职,需要对几百台服务器进行检查。有需要的朋友可以对其进行插件扩展。在使用的过程当中,可以自己配置FTP,目前支持将结果上传到FTP当中。后续会对多个接口进行深入开发,例如添加数据库支持等等。 目前支持:    1)导出XML、HTML、ta

  • Compile Testing 是一个用来测试 Java 和注释处理器的工具。 示例代码: @RunWith(JUnit4.class)public class TreeContextTest {  @Rule public final ExpectedException expectedExn = ExpectedException.none();  private static final S