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?
上面示例的问题在于您传递的是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 .你可能想看一下.例如,如果没有其他配置文件处于活动状态,它将允许您以编程方式激活"本地"的简单选项.
| 归档时间: |
|
| 查看次数: |
6591 次 |
| 最近记录: |