7

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

<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”相同的效果,而不必指定命令行参数。

4

4 回答 4

16

另一种选择是在 @BeforeClass 注释方法中设置环境属性,该方法将在上下文配置发生之前调用。

@BeforeClass
public static void setSystemProps() {
    System.setProperty("configOverride", "yourVal");
}
于 2013-03-07T01:43:21.907 回答
6

想着,

  1. 在其构造函数/初始化块中扩展SpringJUnit4ClassRunner和设置系统属性 configOverride
  2. 然后传递ExtendedSpringJUnit4ClassRunner@RunWith
于 2012-05-30T18:38:52.240 回答
3

这就是我最终要做的——我不必更改任何单元测试类。不幸的是,我没有设置“configOverride”属性(请参阅 AhamedMustafaM 的回答以了解一种方法),而是覆盖原始属性占位符定义(在我最初的尝试失败后我再次尝试并让它工作)。

我将以下行添加到我的 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”,以将任何无法解析的属性委托给原始占位符配置器。

于 2012-05-30T23:01:12.690 回答
0

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

于 2014-10-07T18:39:47.337 回答