[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.기본적으로 @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 작성자)
노트:
from https://stackoverflow.com/questions/27126974/how-to-execute-sql-before-a-before-method by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 OAuth2 싱글 사인 오프 (로그 아웃) (0) | 2019.01.01 |
---|---|
[SPRING] 스프링 부트 CORS 필터 - CORS 프리 플라이트 채널이 성공하지 못함 (0) | 2019.01.01 |
[SPRING] 스프링 보안을 사용하는 IP 필터 (0) | 2019.01.01 |
[SPRING] 스프링 부트 애플리케이션에서 통합 테스트를 위해 임베디드 MongoDB를 어떻게 구성합니까? (0) | 2019.01.01 |
[SPRING] 하나의 Spring 부트 프로젝트, JAR 또는 WAR 모두에 배포 (0) | 2019.01.01 |