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

时间:2012-07-03 08:16:06

标签: java spring environment-variables spring-test

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

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

如果我使用注释配置应用程序上下文,在弹出上下文初始化之前,我没有看到可以执行某些操作的挂钩。

7 个答案:

答案 0 :(得分:100)

您可以在静态初始值设定项中初始化System属性:

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

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

}

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

答案 1 :(得分:66)

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

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

请参阅Spring docsJavadocs中的@TestPropertySource。

答案 2 :(得分:7)

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

<td>
  <span 
    *ngIf="eachOutlet.dollarValue != 0"
    [style.color]="eachOutlet.dollarValue < 0 ? 'red' : null">
      {{eachOutlet.dollarValue | number:'1.0-2'}}
  </span>
</td>

然后除了Spring上下文配置文件位置之外在测试类上配置它:

number

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

答案 3 :(得分:2)

您可以将系统属性设置为VM参数。

如果您的项目是Maven项目,则可以在运行测试类时执行以下命令:

mvn test -Dapp.url="https://stackoverflow.com"

测试类:

public class AppTest  {
@Test
public void testUrl() {
    System.out.println(System.getProperty("app.url"));
    }
}

如果要在Eclipse中运行单个测试类或方法,则:

1)转到运行->运行配置

2)在左侧的“ Junit”部分下选择您的“测试”课程。

3)执行以下操作:

enter image description here

答案 4 :(得分:1)

如果您希望变量对所有测试都有效,您可以在测试资源目录中创建一个application.properties文件(默认情况下为src/test/resources),如下所示:

MYPROPERTY=foo

然后将加载和使用它,除非您通过@TestPropertySource或类似方法获得定义 - 可以在Spring文档章节24. Externalized Configuration中找到加载属性的确切顺序。

答案 5 :(得分:1)

目前,这里所有的答案都只讨论系统属性,这些属性与设置更复杂的环境变量(特别是环境变量)不同。用于测试。值得庆幸的是,下面的类可以用于此,并且类文档中有很好的示例

EnvironmentVariables.html

文档中的一个简单示例,已修改为与@SpringBootTest一起使用

@SpringBootTest
public class EnvironmentVariablesTest {
   @ClassRule
   public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");

   @Test
   public void test() {
     assertEquals("value", System.getenv("name"));
   }
 }

答案 6 :(得分:0)

对于单元测试,当我执行“ mvn clean install”时,系统变量尚未实例化,因为没有服务器在运行该应用程序。因此,为了设置系统属性,我需要在pom.xml中进行设置。像这样:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <MY_ENV_VAR>newValue</MY_ENV_VAR>
            <ENV_TARGET>olqa</ENV_TARGET>
            <buildDirectory>${project.build.directory}</buildDirectory>
        </systemPropertyVariables>
    </configuration>
</plugin>