@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

您可以采取一些措施来解决此问题:

  1. 为日程安排部分创建一个 Profile 并仅在 运行 应用程序
  2. 时启用它
  3. 同上,但如果 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" 列表)。