首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序加载application.yml文件失败

应用程序加载application.yml文件失败
EN

Stack Overflow用户
提问于 2019-05-16 09:32:29
回答 1查看 900关注 0票数 0

我正在写junit测试用例,奇怪的事情发生了,我有两个数据库。

  • 1) (应用层) 2) 测试(测试级)

我的应用程序结构是

代码语言:javascript
复制
    App
    --> src/main/java
    --> src/main/resource
        application.yml

    --> src/test/java
        src/test/resource
        application.yml

当我运行Application时,它加载src/main/ application.yml文件并存储到内存中,并指向campaign db,运行良好。当我运行Junit测试用例时,应用程序再次加载src/main/ application.yml,而不是加载src/ test /Resourceapplication.yml

当我强制运行测试用例时,,然后应用程序指向测试数据库,当我停止服务器并再次运行应用程序时,它再次指向测试数据库,而不是活动数据库。

application.yml for (src/main/resources)或(src/test/resources)

代码语言:javascript
复制
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

测试级配置

代码语言:javascript
复制
@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;
    }
}

应用程序级配置

代码语言:javascript
复制
@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时,它应该指向活动数据库。

EN

回答 1

Stack Overflow用户

发布于 2019-05-16 10:36:29

应用程序属性应该位于主资源目录下,因此您正在经历的行为是正常的。

要实现您想要做的事情,您需要创建一个特定于配置文件的应用程序属性,方法是:

  1. 为每个配置文件拥有一个单独的文件(例如,application-test.yml用于名为test的配置文件),并将其添加到同一个目录中。
  2. 或者像上面所做的那样,在同一个application.yml文件中添加单独的配置文件特定属性。

然后,您需要使用active profile test运行集成测试,然后spring引导将获取与该概要文件特定的属性。

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("test")
public class MyIntegrationTest {
    ....
}

如果不指定和活动配置文件,那么活动配置文件将是default,这意味着spring将加载默认属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56165345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档