복붙노트

[SPRING] @Before 메서드 전에 @Sql을 실행하는 방법

SPRING

@Before 메서드 전에 @Sql을 실행하는 방법

다음 주석을 결합하려고합니다.

org.springframework.test.context.jdbc.Sql 과 org.junit.Before

다음 코드와 같습니다.

@Test
@Sql(scripts = "dml-parametro.sql")
public void testData(){
    Iterable<Parametro> parametros = parametroService.findAll();
    List<Parametro> parametrosList = Lists.newArrayList(parametros);

    Assert.assertThat(parametrosList.size(), Is.is(1));
}

@Before
public void beforeMethod() {
    JdbcTestUtils.deleteFromTables(jdbcTemplate, "PARAMETRO");
}

@Before 메서드의 코드는 @Sql 주석의 "dml-parametro.sql"스크립트 이후에 실행됩니다.

이것을하는 것이 옳은가?

이를 해결하기 위해 @Before보다 @After를 사용하고 있지만 테스트 실행 전에 테이블을 cdelete하고 싶습니다.

@SqlConfig를 사용하고 싶지 않습니다. 나는 테스트 수준에서 transacional 범위를 사용하지 않기 때문에 모든 테스트 방법에서 테이블을 정리해야합니다. 모든 테스트 메소드가 테이블을 정리해야하는 경우 @Before 메소드에서이 작업을 수행하려고합니다. @SqlConfig를 사용하여 모든 테스트 메소드에서이 작업을 수행하고 싶지 않습니다. @Before 이전에 @Sql의 동작이 잘못되었다고 생각합니다.

해결법

  1. ==============================

    1.기본적으로 @Sql을 통해 실행되는 모든 SQL 스크립트는 @Before 메소드보다 먼저 실행됩니다. 따라서 발생하는 동작은 정확하지만 @Sql의 executionPhase 특성을 통해 실행 단계를 변경할 수 있습니다 (아래 예제 참조).

    기본적으로 @Sql을 통해 실행되는 모든 SQL 스크립트는 @Before 메소드보다 먼저 실행됩니다. 따라서 발생하는 동작은 정확하지만 @Sql의 executionPhase 특성을 통해 실행 단계를 변경할 수 있습니다 (아래 예제 참조).

    여러 스크립트를 실행하려면 @Sql을 통해 가능합니다.

    따라서 PARAMETRO 테이블에서 삭제하는 clean-parametro.sql이라는 정리 스크립트가있는 경우 @Before 메서드에서 JdbcTestUtils.deleteFromTables ()를 호출하는 대신 다음과 같이 테스트 메서드에 주석을 달 수 있습니다.

    @Test
    @Sql({"dml-parametro.sql", "clean-parametro.sql"})
    public void test() { /* ... */ }
    

    물론 dml-parametro.sql이 PARAMETRO 테이블에 값을 삽입하면 정리 스크립트에서 해당 값을 즉시 삭제할 수 없습니다.

    @Sql과 @SqlConfig는 스크립트 실행을위한 여러 수준의 구성을 제공합니다.

    예를 들어 테스트 전에 테이블을 만들고 테스트 후에 정리하려면 Java 8에서 다음과 같이 할 수 있습니다.

    @Test
    @Sql("create-tables.sql")
    @Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD)
    public void test() { /* ... */ }
    

    또는 Java 6 또는 Java 7에서 @SqlGroup을 컨테이너로 사용하십시오.

    @Test
    @SqlGroup({
        @Sql("create-tables.sql"),
        @Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD)
    })
    public void test() { /* ... */ }
    

    테스트가 @Transactional이고 커밋 된 데이터베이스 상태를 정리하려면 다음과 같이 새 트랜잭션에서 정리 SQL 스크립트를 실행하도록 Spring에 지시 할 수 있습니다.

    @Test
    @Sql("insert-test-data.sql")
    @Sql(
      scripts = "clean-up.sql",
      executionPhase = AFTER_TEST_METHOD,
      config = @SqlConfig(transactionMode = ISOLATED)
    )
    public void test() { /* ... */ }
    

    나는 이것이 당신을 위해 일들을 명확히하기를 희망합니다!

    건배,

    Sam (Spring TestContext Framework 작성자)

    노트:

  2. from https://stackoverflow.com/questions/27126974/how-to-execute-sql-before-a-before-method by cc-by-sa and MIT license