在我的应用程序中,有几个任务必须在生产中定期执行,但在我的集成测试中不应该runx。 (这些类用Spring @Scheduled
注释注释。)我有两个Spring Boot运行器类:
Application
,定义为:
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class Application {
public static void main(String[] args) throws UnknownHostException {
SpringApplication app = new SpringApplication(Application.class);
SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args);
...
}
和ApplicationTest
,定义为:
@SpringBootApplication
@EnableAsync
public class ApplicationTest {
public static void main(String[] args) throws UnknownHostException {
SpringApplication.run(ApplicationTest.class, args);
}
}
我的测试使用以下注释进行注释:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(ApplicationTest.class)
@WebIntegrationTest(randomPort = true)
我将类ApplicationTest
定义为@SpringApplicationConfiguration
类,应该在运行测试时使用。与Application
类不同ApplicationTest
缺少必要的注释以启用调度。
当我使用mvn test
甚至mvn verify
运行测试时,注释被忽略,使用Application
类启动应用程序,从而启动计划任务。< / p>
我错过了什么?
答案 0 :(得分:2)
这两个类可能都在同一个组件扫描单元中,所以因为Application
是@Configuration
类,所以无论如何都会调用@EnableScheduling
。
你可以采取一些措施来解决这个问题:
Profile
,并仅在您运行应用时启用test
个人资料未处于有效状态并在测试中启用此个人资料,则启用该以下是1的示例,其优点是您不必为测试更改任何内容
@SpringBootApplication
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setAdditionalProfiles("application");
SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args);
...
}
@EnableScheduling
@Profile("application") // or @Profile("!test") for instance
static class ApplicationConfiguration {
}
}
您的ApplicationTest
现在可以消失。
(顺便说一句,你不需要main
类的ApplicationTest
方法,Spring Boot不会为测试执行此类的主要方法:SpringApplicationConfiguration
获取用于构建上下文的&#34;源和#34;列表。