我试图根据Spring Boot测试环境中的活动配置文件(h2或mysql)执行不同的sql脚本。这是我尝试使用MySql导致冻结的测试用例:
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
public class EntityRepositoryTestIT {
@Autowired
EntityRepository entityRepository;
@Autowired
private DataSource dataSource;
@Value("${spring.profiles.active}")
private String profile;
@After
public void after() throws Exception {
ScriptUtils.executeSqlScript(dataSource.getConnection(),
new ClassPathResource("/scripts/test_data_clear_"+profile+".sql"));
}
@Test
@Sql(scripts = "/scripts/test_data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
public void findAllTest() throws Exception {
Assert.assertEquals(7, entityRepository.findAll().size());
}
}
启用了DEBUG的org.springframework.jdbc上的记录器显示冻结在此行的调用上发生:
ALTER TABLE entity AUTO_INCREMENT = 1;
这仅在MySql上失败,而在H2上运行良好:
ALTER TABLE entity ALTER COLUMN id RESTART WITH 1;
通过使用批注,该测试可以与MySql ONLY 再次正常工作
@Sql(scripts = "/scripts/test_data_clear_mysql.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
类似于@sql注释,似乎比ScriptUtils的编程调用增加了更多的逻辑。使用H2,ScriptUtils和@sql注释都可以顺利运行。
问题是注释不允许动态更改已执行的sql脚本,其'scripts'参数是编译时间常数。
任何有关如何使其工作的建议将不胜感激!
答案 0 :(得分:0)
我的直觉是您根本没有正确关闭/返回数据库连接。
@After
public void after() throws Exception {
try (Connection connection = dataSource.getConnection()) {
if (connection != null) {
ScriptUtils.executeSqlScript(connection,
new ClassPathResource("/scripts/test_data_clear_"+profile+".sql"));
log.info("SQL script successful");
} else {
log.warn("!!! No connection available !!!");
}
}
}
即将您的连接包装在try-catch-resources
块中,以便关闭连接(如果您使用的是数据库池(例如,Hikari),则将其返回到池中)。