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



我正在尝试使用Spring-boot运行弹簧测试案例。我的测试课看起来如下

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

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

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

,但另外,您真的不应该使用类似的系统属性。系统属性适用于系统,什么是操作系统,时间系统,语言等。它与您的应用程序无关。这也引入了全球共享状态。尽管您可能不会并没有并行运行测试,但如果您将这些值从测试更改为测试,它们会偶尔打破。您可能会遇到其他问题,例如需要DATA_DB_USER的属性在2个不同组件中不同的情况。

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

例如:

  • export password=...; java -jar app.jar设置一个名为password的环境变量,然后将存在于您的春季环境中
  • java -Dpassword=... -jar app.jar设置了一个JVM系统参数,然后将存在于您的春季环境中
  • java -jar myapp.jar --password=...设置了一个命令行变量,然后将存在于您的春季环境中

您甚至可以从JNDI来源。

文档中的更多详细信息。

最新更新