如何在春季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设置了某个系统属性,则可以避免代码重复。