使用SpringJunit4ClassRunner在Property Placeholder之前设置系统属性或环境变量

时间:2012-05-30 18:19:20

标签: java spring unit-testing properties junit

我有一个主app-context.xml,它定义了一个带有两个位置的属性占位符:default properties file和一个可选的覆盖文件:

<context:property-placeholder
        location="classpath:config.properties,${configOverride}"
        ignore-resource-not-found="true" />

可选的覆盖位置允许指定另一个属性文件(例如“-DconfigOverride = file:/home/app/config.properties”),只包含应该被覆盖的属性。

对于我的单元测试,我正在使用导入app-context.xml的测试上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test-context.xml"})
public class UserServiceTest {
    ...
}

如何在加载应用程序上下文之前在应用程序中设置系统属性或环境变量?我希望实现与在所有测试类中设置“-DconfigOverride = classpath:testConfig.properties”相同的效果,而不必在可能的情况下指定命令行arg。

4 个答案:

答案 0 :(得分:15)

另一个替代方法是在@BeforeClass带注释的方法中设置environment属性,该方法将在上下文配置发生之前调用。

@BeforeClass
public static void setSystemProps() {
    System.setProperty("configOverride", "yourVal");
}

答案 1 :(得分:5)

思考,

  1. 扩展SpringJUnit4ClassRunner并设置系统属性 configOverride在其构造函数/初始化块
  2. 然后将ExtendedSpringJUnit4ClassRunner传递给@RunWith

答案 2 :(得分:3)

这是我最终做的事情 - 我没有必要更改任何单元测试类。不幸的是,我没有设置“configOverride”属性(请参阅AhamedMustafaM的答案,有一种方法可以做到这一点),而是覆盖了原始属性占位符定义(我在最初的失败尝试后再次尝试并使其工作)。 / p>

我在testContext.xml中添加了以下行:

<!-- import the main app context -->
<import resource="classpath:appContext.xml" />

<!-- this is the line i added -->
<context:property-placeholder order="-999"
        location="classpath:testConfig.properties"
        ignore-unresolvable="true" />

请注意order =“ - 999”属性,该属性用于确保优先于原始属性占位符定义。另外,我将“ignore-unresolvable”设置为“true”,以将任何不可解析的属性委托给原始占位符配置器。

答案 3 :(得分:0)

我的问题很相似,但我想设置spring.profiles.active环境变量,结果发现我只需要将@ActiveProfiles()与我想要的值一起投入测试本身。