java - 应用程序无法加载 application.yml 文件
问题描述
我正在编写 junit 测试用例,奇怪的事情发生了我有两个数据库
- 1)活动(应用程序级别) 2)测试 (测试级别)
我的应用程序结构是
App
--> src/main/java
--> src/main/resource
application.yml
--> src/test/java
src/test/resource
application.yml
当我运行Application并加载src/main/resource application.yml文件并存储到内存中并指向可以正常工作的活动数据库时。当我运行Junit 测试用例应用程序再次加载src/main/resource application.yml而不是加载src/test/resource application.yml
当我强制运行测试用例时,应用程序指向测试数据库,当我停止服务器并重新运行应用程序时,它再次指向测试数据库而不是活动数据库。
application.yml for (src/main/resources) 或 (src/test/resources)
spring:
profiles.active: local
aop.proxy-target-class: true
---
spring:
profiles: local
campaignDB:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/campaign
username: root
password: Admin@123
juintDB:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: Admin@123
测试级别配置
@RunWith(SpringRunner.class)
public class TestDbConfig {
@Autowired
private Environment env;
@Bean
@Profile("local")
public DataSource testDbdatasource() {
org.apache.tomcat.jdbc.pool.DataSource datasource = new org.apache.tomcat.jdbc.pool.DataSource();
datasource.setDriverClassName(env.getRequiredProperty("juintDB.driverClassName"));
datasource.setUrl(env.getRequiredProperty("juintDB.url"));
datasource.setUsername(env.getRequiredProperty("juintDB.username"));
datasource.setPassword(env.getRequiredProperty("juintDB.password"));
return datasource;
}
}
应用层配置
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(datasource());
emf.setJpaVendorAdapter(hibernateJpa);
emf.setPackagesToScan("com.brighttalk.campaign.model");
Map<String, String> jpaSchema = new HashMap<String, String>();
jpaSchema.put("hibernate.default_schema",
env.getRequiredProperty("hibernate.default_schema"));
jpaSchema.put("hibernate.dialect",
env.getRequiredProperty("hibernate.dialect"));
jpaSchema.put("hibernate.format_sql",
env.getRequiredProperty("hibernate.format_sql"));
jpaSchema.put("hibernate.hbm2ddl.auto",
env.getRequiredProperty("hibernate.hbm2ddl.auto"));
jpaSchema.put("hibernate.show_sql",
env.getRequiredProperty("hibernate.show_sql"));
emf.setJpaPropertyMap(Collections.singletonMap(
"javax.persistence.validation.mode", "none"));
emf.setJpaPropertyMap(jpaSchema);
return emf;
}
我期待当我测试用例时它应该指向测试数据库。当我运行应用程序时,它应该指向活动数据库。
解决方案
应用程序属性应位于主资源目录下,因此您遇到的行为是正常的。
要实现您想要做的事情,您需要通过以下方式创建配置文件特定的应用程序属性:
- 每个配置文件都有一个单独的文件(例如
application-test.yml
,一个名为 的配置文件test
)并将其添加到同一目录中。 - 或者就像您在上面所做的那样,在同一个
application.yml
文件中添加单独的配置文件特定属性。
然后您需要使用活动配置文件运行集成测试test
,然后 spring boot 将获取特定于该配置文件的属性。
@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("test")
public class MyIntegrationTest {
....
}
如果您没有指定活动配置文件,那么活动配置文件将是default
这意味着弹簧启动将加载默认属性。
推荐阅读
- serial-port - 发送到串口 x0A
- azure - 将数据从 azure blob 存储传输到谷歌云存储的最快方法是什么?
- json - 用于验证键嵌套 json 结构的脚本断言
- c# - c# web api 发现多个动作匹配请求问题
- javascript - 无法在 Ajax 中获得正确的值
- spring-mvc - 如何在 Spring Boot 中使用 multipart/form-data 处理没有 Content-Disposition 标头的 POST
- javascript - 如何处理 catch 块和 Promise
- node.js - Docker 在 package.json 更改时自动重新运行 npm install
- php - PHP - 下载文件并在之后打印一些东西
- python - 带有 Python 消费者的 Docker Kafka