@SpringBootTest-休眠物理命名策略仅在测试中被忽略

问题描述

我的问题是,为什么在测试环境中忽略物理策略? 我尝试了所有标准实现,并实现了自己的命名策略。如示例所示,我将休眠4的旧定义用于命名策略,将休眠5以来的新定义用于命名策略。 仅真实数据库的命名受到影响。如果更改命名策略,则总是以蛇形定义测试数据库实体的命名。例如:user_membership 当我们通过服务器上的sql脚本以及JUnit集成测试创建测试数据时,这种行为很烦人。此外,我们还有一些本机sql文件,可用于长时间运行的导出,以提高性能,如果两种命名策略都不匹配,则我们将无法正确测试这些文件

我最终决定对所有新的后端服务器(在测试数据库和真实数据库中使用相同的命名)使用自定义蛇案策略,但是对于所有旧的后端服务器,由于现有的策略,我无法更改现有策略生产中的数据库

我使用:

application.yml用于服务器执行:

spring:
  resources:
    add-mappings: true
  veLocity:
    enabled: false
  profiles:
    active: @spring.profiles.active@
  datasource:
    url: jdbc:MysqL://${spring.datasource.endpoint}:${spring.datasource.port}/${spring.datasource.name}?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: ${/web-backend-[stage]/app/database/user}
    password: ${/web-backend-[stage]/app/database/password}
    endpoint: ${/web-backend-[stage]/app/database/endpoint}
    port: ${/web-backend-[stage]/app/database/port}
    name: ${/web-backend-[stage]/app/database/name}
  jpa:
    database-platform: org.hibernate.dialect.MysqL5InnoDBDialect
    database: MysqL
    openInView: false
    show_sql: false
    generate-ddl: false
    hibernate:
      ddl-auto: validate
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

用于服务器执行的application-test.yml:

spring:
  veLocity:
    enabled: false
  profiles:
    active: test
  datasource:
    dataSourceClassName: org.h2.jdbcx.JdbcDataSource
    url: jdbc:h2:mem:test;MODE=MysqL;DB_CLOSE_DELAY=-1
    databaseName:
    serverName:
    username:
    password:

  jpa:
    database-platform: org.hibernate.dialect.MysqL5InnoDBDialect
    database: MysqL
    openInView: false
    show_sql: false
    generate-ddl: true
    hibernate:
      ddl-auto: create
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

BaseIntegrationTest.class

import org.springframework.boot.test.context.SpringBoottest;
import org.springframework.boot.test.context.SpringBoottest.WebEnvironment;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.jdbc.sql;

@SuppressWarnings("ClassMayBeInterface") // must be class to inherit annotations
@ActiveProfiles(SpringProfile.TEST)
@sql({"/db/clean.sql","/db/data.sql"})
@SpringBoottest(webEnvironment = WebEnvironment.DEFINED_PORT,classes = {Application.class,TestDataProvider.class})
public abstract class BaseIntegrationTest {

}

在每个测试中:

@Autowired
private WebApplicationContext wac;

@postconstruct
void setup() {
    MockitoAnnotations.initMocks(this);

    restProjectmockmvc = mockmvcBuilders.webAppContextSetup(wac)
       .apply(springSecurity())
       .build();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)