@DataJpaTest 不会读取 spring.jpa.* 属性,而 @SpringBootTest 会

Posted

技术标签:

【中文标题】@DataJpaTest 不会读取 spring.jpa.* 属性,而 @SpringBootTest 会【英文标题】:@DataJpaTest doesn't read spring.jpa.* properties while @SpringBootTest does 【发布时间】:2019-02-14 06:28:19 【问题描述】:

我正在使用 Spring Boot 2.0.4.RELEASE,并将src/test/resources/application.yml 配置为

spring:
  jpa:
    show-sql: false
    hibernate:
      dialect: org.hibernate.dialect.SQLServer2012Dialect
      ddl-auto: none
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      properties:
        hibernate:
          generate_statistics: false
          show_sql: false

我有一个非常简单的测试:

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ExtendWith(SpringExtension.class)
public class MyTest 
  ...

测试忽略了属性(在打印休眠语句时可以很容易地看到)。将相同的属性放在application.properties 文件中是有效的。

将名称更改为 application-test.yml 并在配置文件测试中运行也无济于事。

@DataJpaTest 注释更改为@SpringBootTest 时,它正在工作...

请务必注意,其余属性(具体与我的应用程序相关且不带 spring.* 前缀的内容正在正常读取和使用

我更喜欢使用 yaml 文件(例如在 /src/main/resources 中),而不是只为纯 JPA 测试加载完整的 @SpringBootTest...还有什么我可以配置的吗?

【问题讨论】:

对我来说它打印 jpa sql 语句而不读取标志,超级烦人! 尝试添加:@TestPropertySource(locations = "classpath:application.yaml") 【参考方案1】:

这是缩进的问题。 properties 必须向左移动一级。

spring:
  jpa:
    show-sql: false
    hibernate:
      dialect: org.hibernate.dialect.SQLServer2012Dialect
      ddl-auto: none
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    properties:
      hibernate:
        generate_statistics: false
        show_sql: false

但如果你使用 logback.xml 来记录配置,你也可以试试这个:

<logger name="org.hibernate.stat" level="OFF"/>

【讨论】:

以上是关于@DataJpaTest 不会读取 spring.jpa.* 属性,而 @SpringBootTest 会的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 1.4 @DataJpaTest - 创建名为“dataSource”的 bean 时出错

如果 Spring 安全性在类路径上,则无法使用 @DataJpaTest

Spring Boot:使用 @DataJpaTest 和 Flyway 设置 Hibernate 命名策略

如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台

使用 @DataJpaTest 的 Spring 测试无法使用 @Repository 自动装配类(但使用接口存储库可以工作!)

在 JUnit 5 中使用 @TestContainers 实现 @DataJpaTest