在每次春季启动时都覆盖一个@Configuration类@Test

时间:2016-08-19 14:27:54

标签: spring spring-boot spring-test

在我的春季启动应用程序中,我希望在我的所有测试中仅使用测试配置(特别是我的@Configuration @EnableAuthorizationServer类)覆盖我的@Configuration个类之一。< / p>

在对spring boot testing featuresspring integration testing features进行概述后,到目前为止还没有出现直接的解决方案:

  • @TestConfiguration:这是为了扩展,而不是覆盖;
  • @ContextConfiguration(classes=…​)@SpringApplicationConfiguration(classes =…​)让我覆盖整个配置,而不仅仅是一个类;
  • 建议@Configuration内的@Test内部类覆盖默认配置,但不提供示例;

有什么建议吗?

3 个答案:

答案 0 :(得分:48)

内部测试配置

测试的内部@Configuration示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {

    @Configuration
    static class ContextConfiguration {
        @Bean
        @Primary //may omit this if this is the only SomeBean defined/visible
        public SomeBean someBean () {
            return new SomeBean();
        }
    }

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

可重复使用的测试配置

如果您希望将测试配置重用于多个测试,则可以使用Spring Profile @Profile("test")定义独立的Configuration类。然后,让您的测试类使用@ActiveProfiles("test")激活配置文件。请参阅完整代码:

@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

@Configuration
@Profile("test")
public class TestConfiguration {
    @Bean
    @Primary //may omit this if this is the only SomeBean defined/visible
    public SomeBean someBean() {
        return new SomeBean();
    }
}

<强> @Primary

bean定义的@Primary注释是为了确保如果找到多个注释,那么这个注释将具有优先权。

答案 1 :(得分:9)

您应该使用spring boot profiles

  1. 使用@Profile("test")注释您的测试配置。
  2. 使用@Profile("production")注释您的生产配置。
  3. 在您的属性文件中设置生产个人资料:spring.profiles.active=production
  4. 使用@Profile("test")在测试类中设置测试配置文件。
  5. 因此,当您的应用程序启动时,它将使用“生产”类,当测试星星时它将使用“测试”类。

    如果使用内部/嵌套@Configuration类,则将使用它而不是应用程序的主要配置。

答案 2 :(得分:1)

我最近不得不创建一个应用程序的dev版本,该版本应以dev有效配置文件运行,并且没有任何命令行参数。我通过将这一类添加为新条目来解决它,该条目以编程方式设置了活动配置文件:

package ...;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment;

@Import(OriginalApplication.class)
public class DevelopmentApplication {
    public static void main(String[] args) {
        SpringApplication application =
            new SpringApplication(DevelopmentApplication.class);
        ConfigurableEnvironment environment = new StandardEnvironment();
        environment.setActiveProfiles("dev");
        application.setEnvironment(environment);
        application.run(args);
    }
}

有关更多详细信息,请参见Spring Boot Profiles Example by Arvind Rai