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}感谢您的任何建议!
2 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
您可以将 @Profile 注释与单独的类一起使用,每个类都用于每个 DMBS,将公共逻辑放在另一个类中以避免代码重复。您正在使用 Spring,因此您可以使用以下内容来获取它。
@Profile("mysql")
@Sql(scripts="... my mysql scripts...")
public class MySqlTests{
@Autowired
private CommonTestsLogic commonLogic;
@Test
public void mySqlTest1(){
commonlogic.test1();
}
}
@Profile("oracle")
@Sql(scripts="... my oracle scripts...")
public class MyOracleTests{
@Autowired
private CommonTestsLogic commonLogic;
@Test
public void myOracleTest1(){
commonlogic.test1();
}
}
添加回答
举报
0/150
提交
取消