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

Java 如何在spring测试中动态设置环境变量,java,spring,spring-mvc,spring-boot,spring-boot-test,Java,Spring,Spring Mvc,Spring Boot,Spring Boot Test,我正在尝试使用spring boot运行spring测试用例。我的测试类如下所示 @ContextConfiguration(initializers = TestContextInitializer.class) @RunWith(SpringRunner.class) @SpringBootTest(classes = {TestServiceApplication.class}) public class SampleTest { @org.junit.Test publ

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

@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");
    }
}
公共类TestContextInitializer实现ApplicationContextInitializer{
@凌驾
公共无效初始化(ConfigurableApplicationContext ConfigurableApplicationContext){
setProperty(“DATA_DB_URL”,“some_URL”);
set属性(“数据用户”、“某些用户”);
set属性(“数据\数据库\密码”、“某些\密码”);
System.setProperty(“数据\数据库\池\大小”,“2”);
System.setProperty(“数据行预取大小”,“50”);
}
}

一切正常,但我有问题。我不能按照我公司的政策在源代码中签入密码。我如何将密码外部化,以便不必签入密码

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

例如:

  • 导出密码=。。。;java-jarapp.jar
    设置一个名为
    password
    的环境变量,该变量将出现在Spring环境中
  • java-Dpassword=-jar app.jar
    设置一个JVM系统参数,该参数将出现在Spring环境中
  • java-jarmyapp.jar--password=…
    设置一个命令行变量,该变量随后将出现在Spring环境中
您甚至可以从JNDI获取一个属性


更多详细信息。

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

但另一方面,您真的不应该使用这样的系统属性。系统属性用于系统、操作系统、时间系统、语言等。它不应该与您的应用程序有任何关系。这还引入了全局共享状态。虽然您可能不知道,但如果您开始并行运行测试,如果您在不同的测试中更改这些值,它们将偶尔中断。您可能会遇到其他问题,例如,对于两个不同的组件,您需要
DATA\u DB\u USER
的属性不同