[컴] Spring Test 에서 @Sql 을 code 로

springboot test / junit / unittest/ /통합테스트 / .sql / query / 쿼리실행 / 초기 데이터 세팅 / setup / @Sql 대신 사용

Spring Test 에서 @Sql 을 code 로

아래와 같은 annotation 을

@JooqTest
@Sql({"classpath:myquery1.sql", "classpath:myquery2.sql"})
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTests {
    ...
}

아래처럼 변경했다. 아래는 특정 profile 이 아닐때만 sql 을 실행하도록 했다.

@JooqTest
// @Sql({"classpath:myquery1.sql", "classpath:myquery2.sql"})
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTests {

    // require: @JooqTest
    @Autowired
    DSLContext ctx;
    @Autowired
    DataSource dataSource;
    @Autowired
    Environment env;

    ProductStatusBgJobProcessor backgroundJobProcessor;

    @BeforeAll
    void beforeAll() {
        runSqlInitData(dataSource);
    }

    @BeforeEach
    void setUp() {

        ...
    }

    @Test
    void myTest1() throws Exception {

        ...

    }

    private void runSqlInitData(DataSource dataSource) {
        final String EXCLUDE_PROFILE = "testnocontainer";
        var activeProfiles = env.getActiveProfiles();
        if (activeProfiles.length <= 0 || !activeProfiles[0].equals(EXCLUDE_PROFILE)) {
            // when not 'testnocontainer' profile
            ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
            populator.addScripts(
                    new ClassPathResource("myquery1.sql"),
                    new ClassPathResource("myquery2.sql"));
            populator.setSeparator(";");
            populator.execute(dataSource);
        }
    }
}

Spring, Integration Test 에서 sql file을 실행하기

sql script 를 실행하기 위해 다음 4개의 함수를 사용할 수 있다.

  • org.springframework.jdbc.datasource.init.ScriptUtils: SQL 스크립트가 parse되고 실행되는 방법을 완전히 제어할 때 사용
  • org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
    • 내부적으로 ScriptUtils 를 사용
  • org.springframework.test.context.junit4.[AbstractTransactionalJUnit4SpringContextTests](https://docs.spring.io/spring-framework/reference/testing/testcontext-framework/support-classes.html#testcontext-support-classes-junit4)
    • 내부적으로 ResourceDatabasePopulator를 사용
  • org.springframework.test.context.testng.[AbstractTransactionalTestNGSpringContextTests](https://docs.spring.io/spring-framework/reference/testing/testcontext-framework/support-classes.html#testcontext-support-classes-testng)
    • 내부적으로 ResourceDatabasePopulator를 사용

Reference

  1. Executing SQL Scripts :: Spring Framework

댓글 없음:

댓글 쓰기