1

我正在将我所有的 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);
  }
}

然后我用以下注释对我的测试进行了注释:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CompanyApplicationContextInitializer.class)

但是,当我尝试运行我的测试时,我的自动接线部件没有被找到。我在正确的轨道上吗?我如何在这个类中以编程方式设置我的 ApplicationContext?

4

2 回答 2

5

上面示例的问题是您传递了一个ApplicationContextInitializer 类@ContextConfiguration#classes。#classes 属性旨在接受标有 Spring 的 @Configuration 注释的类。

ApplicationContextInitializer 主要用于 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 。你可能想把手表放在上面。例如,如果没有其他配置文件处于活动状态,它将允许您以编程方式激活“本地”的简单选项。

于 2012-04-28T10:08:01.230 回答
1

尝试将应用上下文 XML 的位置添加到第二个注释:

@ContextConfiguration(locations = {
    "classpath:applicationContext.xml"
})
于 2012-04-27T22:23:14.450 回答