在测试期间调用计划的方法

时间:2016-10-24 20:25:34

标签: java testing spring-boot scheduled-tasks

我正在使用Maven开发SpringBoot应用程序。

我有一个@Component注释的类,其中的方法m带有@Scheduled(initialDelay = 1000, fixedDelay = 5000)注释。此处fixedDelay可以设置为指定从完成任务开始测量的调用之间的间隔。

我还在主要类中的@EnableScheduling注释:

@SpringBootApplication
@EnableScheduling
public class FieldProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(FieldProjectApplication.class, args);
    }

}

现在每当我运行测试时,定义为:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BankitCrawlerTests {

...

}

计划任务m也每5秒运行一次。

当然,我只想在应用程序运行时运行计划任务。我该怎么做(即阻止计划任务在运行测试时运行)?

1 个答案:

答案 0 :(得分:17)

您可以将@EnableScheduling提取到单独的配置类,如:

@Configuration
@Profile("!test")
@EnableScheduling
class SchedulingConfiguration {
}

一旦完成,剩下的唯一事情就是通过使用以下方法注释测试类来激活测试中的“test”配置文件:

@ActiveProfiles("test")

此解决方案的可能缺点是您使生产代码了解测试。

或者,您可以使用属性进行游戏,而不是使用SchedulingConfiguration注释@Profile,而只能在生产@ConditionalOnProperty中使用属性application.properties。例如:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Configuration
    @ConditionalOnProperty(value = "scheduling.enabled", havingValue = "true", matchIfMissing = true)
    @EnableScheduling
    static class SchedulingConfiguration {

    }
}

当您执行以下操作之一时,调度程序将无法在测试中运行:

  • 将属性添加到src/test/resources/application.properties

    scheduling.enabled =假

  • 自定义@SpringBootTest

    @SpringBootTest(properties = "scheduling.enabled=false")