猿问

Spring Boot 测试:根据活动配置文件在测试中执行不同的 sql 脚本?

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


}

感谢您的任何建议!


30秒到达战场
浏览 194回答 2
2回答

慕哥9229398

您可以将 @Profile 注释与单独的类一起使用,每个类都用于每个 DMBS,将公共逻辑放在另一个类中以避免代码重复。您正在使用 Spring,因此您可以使用以下内容来获取它。@Profile("mysql")@Sql(scripts="... my mysql scripts...")public class MySqlTests{&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private CommonTestsLogic commonLogic;&nbsp; &nbsp; @Test&nbsp; &nbsp; public void mySqlTest1(){&nbsp; &nbsp; &nbsp; &nbsp;commonlogic.test1();&nbsp; &nbsp; }}@Profile("oracle")@Sql(scripts="... my oracle scripts...")public class MyOracleTests{&nbsp; &nbsp;@Autowired&nbsp; &nbsp;private CommonTestsLogic commonLogic;&nbsp; &nbsp;@Test&nbsp; &nbsp;public void myOracleTest1(){&nbsp; &nbsp; &nbsp; &nbsp;commonlogic.test1();&nbsp; &nbsp;}}
随时随地看视频慕课网APP

相关分类

Java
我要回答