如何在春季测试中设置环境变量或系统属性?

我想编写一些测试来检查部署的WAR的XML Spring配置。 不幸的是一些bean需要设置一些环境变量或系统属性。 在使用方便的测试样式和@ContextConfiguration时,如何在spring bean初始化之前设置一个环境变量?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }

如果我使用注释来配置应用程序上下文,那么在Spring上下文初始化之前我没有看到一个可以做些事情的钩子。


您可以在静态初始化器中初始化System属性:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {

    static {
        System.setProperty("myproperty", "foo");
    }

}

在初始化Spring应用程序上下文之前,将执行静态初始化程序代码。


从Spring 4.1开始,正确的做法是使用@TestPropertySource注释。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
    ...    
}

请参阅Spring文档和Javadocs中的@TestPropertySource。


也可以使用测试ApplicationContextInitializer来初始化系统属性:

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext)
    {
        System.setProperty("myproperty", "value");
    }
}

然后在Spring上下文配置文件位置之外将其配置在测试类上:

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}

如果应该为所有单元测试设置某个系统属性,则可以避免代码复制。

链接地址: http://www.djcxy.com/p/82043.html

上一篇: How to set environment variable or system property in spring tests?

下一篇: Spring scopes differences