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

How to set environment variable dynamically in spring test

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

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

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

}

虽然我的配置 class 看起来像

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");
    }
}

一切正常,但我遇到了问题。作为我公司的政策,我不能在源代码中签入密码。我怎样才能将密码外部化,这样我就不必签入了。

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

例如:

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

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

更多详情in the docs

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

但另一方面,您真的不应该那样使用系统属性。 System properties是针对系统的,什么是OS,时间系统,语言等等,应该和你的应用没有任何关系。这也引入了全局共享状态。虽然如果您要开始 运行 并行测试,您可能不会这样做,但如果您在不同测试之间更改这些值,它们会偶尔中断。您可以 运行 解决其他问题,例如您需要 DATA_DB_USER 的 属性 对于 2 个不同的组件是不同的。