我正在尝试使用spring-boot运行spring-test案例。我的测试类如下所示
@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");
}
}
一切正常,但我有问题。我无法在源代码中签入PASSWORD作为我的公司政策。如何将密码外部化,以便我不必将其签入。
答案 0 :(得分:1)
只需使用环境变量。或者有@PropertySource
注释用于为测试使用不同的属性。
但另一方面,你真的不应该像那样使用系统属性。系统属性适用于系统,操作系统,时间系统,语言等等。它不应与您的应用程序有任何关系。这也引入了全局共享状态。虽然如果你开始并行运行测试,你可能不会这样做,但是如果你将这些值从test更改为test,它们会偶尔破坏。您可能会遇到其他问题,例如您需要DATA_DB_USER
的属性才能使2个不同的组件不同。
答案 1 :(得分:0)
您可以在运行时通过系统或环境或命令行变量提供密码(或任何Spring属性)。所有这些源都是(a)在运行时定义,(b)在代码库外部。
例如:
export password=...; java -jar app.jar
设置一个名为password
的环境变量,该变量将出现在Spring环境中java -Dpassword=... -jar app.jar
设置一个JVM系统参数,该参数将出现在Spring Environment java -jar myapp.jar --password=...
设置一个命令行变量,该变量将出现在Spring环境中您甚至可以从JNDI中获取属性。
更多详情in the docs。