@SpringApplicationConfiguration中定义的配置类在单元测试

时间:2016-01-05 19:49:22

标签: spring spring-boot integration-testing

在我的应用程序中,有几个任务必须在生产中定期执行,但在我的集成测试中不应该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>

我错过了什么?

1 个答案:

答案 0 :(得分:2)

这两个类可能都在同一个组件扫描单元中,所以因为Application@Configuration类,所以无论如何都会调用@EnableScheduling

你可以采取一些措施来解决这个问题:

  1. 为计划部分创建Profile,并仅在您运行应用时启用
  2. 同上,但如果test个人资料未处于有效状态并在测试中启用此个人资料,则启用该
  3. 以下是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;列表。