【问题标题】:Application failed to load application.yml file应用程序无法加载 application.yml 文件
【发布时间】:2019-10-03 13:01:07
【问题描述】:

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

  • 1) 广告系列(应用程序级别) 2) test(测试级别)

我的应用结构是

    App
    --> src/main/java
    --> src/main/resource
        application.yml

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

当我运行 Application 并加载 src/main/resource application.yml 文件并存储到内存中并指向 campaign 数据库时工作正常。 当我运行 Junit 测试用例 应用程序再次加载 src/main/resource application.yml 而不是加载 src/test/resource application.yml p>

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

application.yml 用于 (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;
}

我期望当我测试用例时它应该指向测试数据库。 当我运行应用程序时,它应该指向活动数据库。

【问题讨论】:

    标签: java hibernate spring-boot junit yaml


    【解决方案1】:

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

    要实现您想要做的事情,您需要通过以下方式创建配置文件特定的应用程序属性:

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

    然后,您需要使用活动配置文件 test 运行集成测试,然后 spring boot 将获取特定于该配置文件的属性。

    @RunWith(SpringRunner.class)
    @SpringBootTest()
    @ActiveProfiles("test")
    public class MyIntegrationTest {
        ....
    }
    

    如果您没有指定活动配置文件,那么活动配置文件将为default,这意味着 spring boot 将加载默认属性。

    【讨论】:

    • Ahmed Abdelhady 感谢回复,我选择了第 1 点,在 src/test/resources 文件夹下创建了 application-test.yml 文件,在运行测试用例时它只指向 src/main/resources 应用程序文件而不是测试 application-test.yml ,因为这两个文件具有几乎相同的配置,所以工作正常,但仍然选择了错误的 application.yml
    • 所有应用程序属性文件都应该位于src/main/resources 下,如果您希望 spring boot 检测并加载它们并使用额外的配置,无论您计划将它们用于测试或实际业务逻辑的事实
    • 也不需要任何测试配置,只需使用 spring boot 属性中的数据源属性,而不是添加自定义数据源属性,spring boot 将自动为您创建数据源 bean。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多