【发布时间】:2026-01-04 02:10:02
【问题描述】:
Spring Boot Test 是否可以根据活动配置文件设置 sql 脚本的条件执行? 我的意思是,我的存储库集成测试使用了一些 @sql 注释,例如:
@Sql(scripts = "/scripts/entity_test_clear.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
对于配置文件 h2,我想执行 entity_test_clear.sql
对于配置文件 mysql,我想执行 entity_test_clear_mysql.sql
原因是我对这些数据库使用了不同的语法,尤其是这个:
ALTER TABLE organisation ALTER COLUMN org_id RESTART WITH 1;ALTER TABLE organisation AUTO_INCREMENT = 1;
mysql不理解语法#1,而h2不理解语法#2(尽管设置了mysql模式,比如MODE=MYSQL)
默认情况下,我使用 h2 进行 IT 测试,但在极少数情况下,我也希望使用 mysql 检查一切是否正常。
PS 我当然可以尝试使用@Profile 的直接解决方案,并为 h2 和 mysql 的每个测试硬编码两个副本,但它与测试中的大量代码重复相结合,我想避免这种情况。
已编辑: 测试用例如下所示:
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
public class EntityRepositoryTestIT {
@Autowired
private EntityRepository entityRepository;
@Test
@Sql(scripts = {"/scripts/entity_test_data.sql", "/scripts/entity_test_data_many.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(scripts = "/scripts/entity_test_clear.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public void findTest() {
Page<Entity> e = entityRepository.findBySomeDetails(1L, PageRequest.of(0, 20));
Assert.assertEquals(3, e.getContent().size());
Assert.assertEquals(1, e.getContent().get(0).getResources().size());
// more asserts
}
感谢您的任何建议!
【问题讨论】:
-
你能告诉我们你是如何对 h2 或 MySQL 之一进行测试的
-
添加了测试用例
-
你为什么不使用@Profile 和分离的类,把公共逻辑放在另一个类中?
-
好的,这似乎是一种解决方案!
标签: java sql spring spring-boot