Java Spring ApplicationContext配置

Sco*_*ott 1 java spring unit-testing

我正在将所有Spring配置移动到Java代码.我遇到了一个问题,我现在想要根据命令行开关或maven配置文件等设置我正在使用的配置文件......我还想避免在我的每个测试中放置所有相同的注释类.这不是一个Web应用程序,而是一个功能测试套件.

这是我的尝试:

public class CompanyApplicationContextInitializer 
  implements ApplicationContextInitializer<ConfigurableApplicationContext> {

  @Override
  public void initialize(final ConfigurableApplicationContext applicationContext) {
    final AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext();
    rootContext.getEnvironment().setActiveProfiles(System.getProperty("spring.profile.active", "local"));
    rootContext.register(LocalConfiguration.class, SauceLabsConfiguration.class);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我用以下内容注释我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CompanyApplicationContextInitializer.class)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行我的测试时,我的自动装配件未找到.我在正确的轨道上吗?如何在此类中连接以编程方式设置我的ApplicationContext?

Chr*_*ams 5

上面示例的问题在于您传递的是ApplicationContextInitializer类@ContextConfiguration#classes.#classes属性用于接受使用Spring的@Configuration批注标记的类.

ApplicationContextInitializer主要用于Web应用程序,在Web应用程序中很难获得对WebApplicationContext的编程访问."contextInitializerClasses"init-param可以传递给Spring DispatcherServlet,Spring将在适当的时候调用您的ACI实现,允许您在#refresh()之前操作应用程序上下文.

在您的情况下,您似乎只关心激活集成测试的配置文件.所以你的ACI是不必要的.使用Spring的@ActiveProfiles注释标记集成测试,以指示哪些配置文件处于活动状态.

请注意,如果已将spring.profiles.active设置为JVM系统属性或环境变量,则将自动激活指定的配置文件.即,不需要像在ACI实现中那样调用System#getProperty.然而,有一点需要注意的是,根据您的ACI实现中的逻辑,如果提供spring.profiles.active作为系统属性或环境变量,则您希望回退到名为"local"的配置文件.您可能有兴趣知道有一个名为字面"默认"的"保留默认配置文件".这可能与您的"本地"配置文件具有相同的语义.考虑将"本地"配置文件重命名为"默认".

最后,请注意,在@ContextConfiguration类中提供ApplicationContextInitializer支持确实存在开放式改进请求:https://jira.springsource.org/browse/SPR-9011 .你可能想看一下.例如,如果没有其他配置文件处于活动状态,它将允许您以编程方式激活"本地"的简单选项.