@SpringApplicationConfiguration 中定义的配置 class 在单元测试中被忽略
Configuration class defined in @SpringApplicationConfiguration gets ignored in unit test
在我的应用程序中,有几个任务必须在生产中定期执行,但在我的集成测试中不应该 运行x。 (这些 classes 用 Spring 的 @Scheduled
注释进行了注释。)我有两个 Spring Boot 运行ner classes:
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)
我将 class ApplicationTest
定义为 @SpringApplicationConfiguration
class,应该在 运行 测试中使用。不像 Application
class ApplicationTest
缺少启用调度所需的注释。
当我 运行 使用 mvn test
甚至 mvn verify
进行测试时,注释将被忽略,使用 Application
class 启动应用程序,因此开始计划任务。
我错过了什么?
两个 class 可能在同一个组件扫描单元中,因此由于您的 Application
是 @Configuration
class,所以无论如何都会调用 @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
现在可以离开了。
(顺便说一句,您的 ApplicationTest
class 不需要 main
方法,Spring Boot 不会执行此类 class 用于测试:SpringApplicationConfiguration
获取用于构建上下文的 "sources" 列表)。
在我的应用程序中,有几个任务必须在生产中定期执行,但在我的集成测试中不应该 运行x。 (这些 classes 用 Spring 的 @Scheduled
注释进行了注释。)我有两个 Spring Boot 运行ner classes:
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)
我将 class ApplicationTest
定义为 @SpringApplicationConfiguration
class,应该在 运行 测试中使用。不像 Application
class ApplicationTest
缺少启用调度所需的注释。
当我 运行 使用 mvn test
甚至 mvn verify
进行测试时,注释将被忽略,使用 Application
class 启动应用程序,因此开始计划任务。
我错过了什么?
两个 class 可能在同一个组件扫描单元中,因此由于您的 Application
是 @Configuration
class,所以无论如何都会调用 @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
现在可以离开了。
(顺便说一句,您的 ApplicationTest
class 不需要 main
方法,Spring Boot 不会执行此类 class 用于测试:SpringApplicationConfiguration
获取用于构建上下文的 "sources" 列表)。