如何在春季testing中设置环境variables或系统属性?

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

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

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

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

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:whereever/context.xml") public class TestWarSpringContext { static { System.setProperty("myproperty", "foo"); } } 

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

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

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

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

也可以使用testingApplicationContextInitializer来初始化一个系统属性:

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

然后在Spring上下文configuration文件位置之外在testing类上configuration它:

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

这样,如果为所有unit testing设置了某个系统属性,则可以避免代码重复。