我想编写一些检查已部署WAR的XML Spring配置的测试。不幸的是,某些bean需要设置一些环境变量或系统属性。在使用方便的测试样式和@ContextConfiguration时,如何在初始化spring bean之前设置环境变量?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
如果我使用注释配置应用程序上下文,在弹出上下文初始化之前,我没有看到可以执行某些操作的挂钩。
答案 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 docs和Javadocs中的@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)执行以下操作:
答案 4 :(得分:1)
如果您希望变量对所有测试都有效,您可以在测试资源目录中创建一个application.properties
文件(默认情况下为src/test/resources
),如下所示:
MYPROPERTY=foo
然后将加载和使用它,除非您通过@TestPropertySource
或类似方法获得定义 - 可以在Spring文档章节24. Externalized Configuration中找到加载属性的确切顺序。
答案 5 :(得分:1)
目前,这里所有的答案都只讨论系统属性,这些属性与设置更复杂的环境变量(特别是环境变量)不同。用于测试。值得庆幸的是,下面的类可以用于此,并且类文档中有很好的示例
文档中的一个简单示例,已修改为与@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>