How to set environment variable or system property in spring tests?
You can initialize the System property in a static initializer:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:whereever/context.xml")public class TestWarSpringContext { static { System.setProperty("myproperty", "foo"); }}
The static initializer code will be executed before the spring application context is initialized.
The right way to do this, starting with Spring 4.1, is to use a @TestPropertySource
annotation.
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:whereever/context.xml")@TestPropertySource(properties = {"myproperty = foo"})public class TestWarSpringContext { ... }
See @TestPropertySource in the Spring docs and Javadocs.
One can also use a test ApplicationContextInitializer to initialize a system property:
public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>{ @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.setProperty("myproperty", "value"); }}
and then configure it on the test class in addition to the Spring context config file locations:
@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)@RunWith(SpringJUnit4ClassRunner.class)public class SomeTest{...}
This way code duplication can be avoided if a certain system property should be set for all the unit tests.