如何在 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 个不同的组件是不同的。
我正在尝试 运行 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 个不同的组件是不同的。