如何解决@SpringBootTest-休眠物理命名策略仅在测试中被忽略
我的问题是,为什么在测试环境中忽略物理策略? 我尝试了所有标准实现,并实现了自己的命名策略。如示例所示,我将休眠4的旧定义用于命名策略,将休眠5以来的新定义用于命名策略。 仅真实数据库的命名受到影响。如果更改命名策略,则总是以蛇形定义测试数据库实体的命名。例如:user_membership 当我们通过服务器上的sql脚本以及JUnit集成测试创建测试数据时,这种行为很烦人。此外,我们还有一些本机sql文件,可用于长时间运行的导出,以提高性能,如果两种命名策略都不匹配,则我们将无法正确测试这些文件。
我最终决定对所有新的后端服务器(在测试数据库和真实数据库中使用相同的命名)使用自定义蛇案策略,但是对于所有旧的后端服务器,由于现有的策略,我无法更改现有策略生产中的数据库。
我使用:
- Spring Boot:2.2.5.RELEASE
- spring-boot-starter-web
- spring-boot-starter-test
- spring-boot-starter-data-jpa
- 休眠:5.3.15。最终
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 举报,一经查实,本站将立刻删除。