如何在spring测试中动态设置环境变量

时间:2017-09-19 15:57:57

标签: java spring spring-mvc spring-boot spring-boot-test

我正在尝试使用spring-boot运行spring-test案例。我的测试类如下所示

@ContextConfiguration(initializers = TestContextInitializer.class)
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestServiceApplication.class})

public class SampleTest {
    @org.junit.Test
    public void getContactsByName() throws Exception {
    }

}

虽然我的配置类看起来像

public class TestContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        System.setProperty("DATA_DB_URL","some_url");
        System.setProperty("DATA_DB_USER","some_user");
        System.setProperty("DATA_DB_PASSWORD","some_password");
        System.setProperty("DATA_DB_POOL_SIZE","2");
        System.setProperty("DATA_DB_ROW_PREFETCH_SIZE","50");
    }
}

一切正常,但我有问题。我无法在源代码中签入PASSWORD作为我的公司政策。如何将密码外部化,以便我不必将其签入。

2 个答案:

答案 0 :(得分:1)

只需使用环境变量。或者有@PropertySource注释用于为测试使用不同的属性。

但另一方面,你真的不应该像那样使用系统属性。系统属性适用于系统,操作系统,时间系统,语言等等。它不应与您的应用程序有任何关系。这也引入了全局共享状态。虽然如果你开始并行运行测试,你可能不会这样做,但是如果你将这些值从test更改为test,它们会偶尔破坏。您可能会遇到其他问题,例如您需要DATA_DB_USER的属性才能使2个不同的组件不同。

答案 1 :(得分:0)

您可以在运行时通过系统或环境或命令行变量提供密码(或任何Spring属性)。所有这些源都是(a)在运行时定义,(b)在代码库外部。

例如:

  • export password=...; java -jar app.jar设置一个名为password的环境变量,该变量将出现在Spring环境中
  • java -Dpassword=... -jar app.jar设置一个JVM系统参数,该参数将出现在Spring Environment
  • java -jar myapp.jar --password=...设置一个命令行变量,该变量将出现在Spring环境中

您甚至可以从JNDI中获取属性。

更多详情in the docs