我正在使用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秒运行一次。
当然,我只想在应用程序运行时运行计划任务。我该怎么做(即阻止计划任务在运行测试时运行)?
答案 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")