我正在尝试使用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来源。
文档中的更多详细信息。