2012-04-27 188 views
1

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

这里是我的尝试:

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?

回答

5

与你上面的例子的问题是,你传递一个ApplicationContextInitializer类@ ContextConfiguration#类。 #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。你可能想要关注一下。例如,如果没有其他配置文件处于活动状态,它将允许您以编程方式激活“本地”的简单选项。

+0

我希望避免有一个基础测试类,它定义了所有的配置选项,但它看起来像我不会有选择(目前)。我希望避免必须在每个测试类上放置哪个配置文件处于活动状态(这很容易在这里使用JVM属性完成),但我绝对希望避免必须在每个测试类上放置ContextConfiguration注释,因此将其升级到基准测试将缓解该问题。 – Scott 2012-04-30 12:40:37

+0

@ActiveProfiles注解可以在基类中使用,它将应用于所有的子类。此外,该注释具有许多属性,包括一个名为inheritLocations的属性。看到Javadoc。 – 2012-07-13 19:38:35

1

尝试增加你的应用程序上下文XML的位置到第二注释:

@ContextConfiguration(locations = { 
    "classpath:applicationContext.xml" 
}) 
+0

当我在星期一得到它时会尝试,但目前没有xml文件。添加一个只是为了声明这个bean吗?在其他地方使用所有的java配置时,似乎与直觉不符。 – Scott 2012-04-28 03:23:11

+0

不,请更改注释,以便您的应用程序上下文在启动时加载。 – duffymo 2012-04-28 13:10:48