2014-11-25 3 views
9

전에 @Sql을 실행하는 방법 : org.springframework.test.context.jdbc.Sql @Before의 I는 다음과 주석을 결합하기 위해 노력하고있어 방법

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를 사용하고 있지만 테스트 실행 전에 테이블을 삭제하려고합니다.

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

답변

31

, @Sql 통해 실행 모든 SQL 스크립트는 어떤 @Before 방법 전에 실행됩니다. 따라서 발생한 문제는 맞지만 executionPhase 속성 (@Sql)을 통해 실행 단계를 변경할 수 있습니다 (아래 예 참조).

여러 스크립트를 실행하려면 @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은 스크립트 실행을위한 여러 수준의 구성을 제공합니다.

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

또는 자바 6에 컨테이너 @SqlGroup를 사용

는 테스트하기 전에 테이블을 작성하고 테스트 후 정리하려는 경우 예를 들어, 자바 8 일이 같은 뭔가를 할 수 자바 7 : 당신의 검사 결과가 @Transactional이고, 당신은 최선을 다하고 데이터베이스 상태를 정리하려는 경우, 당신은이 같은 새로운 트랜잭션에 정리 SQL 스크립트를 실행하기 위해 스프링을 지시 할 수

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

:

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

이 점이 나에게 도움이되기를 바랍니다.

건배,

(스프링 TestContext 프레임 워크의 저자)


주 :

  • AFTER_TEST_METHOD

    정적 ExecutionPhase
  • ISOLATED에서 수입되는 정적에서 가져옵니다 TransactionMode
+0

나는 일부 스크립트를 실행하는'@Sql'과'@Sql'로 주석이 첨부 된 서브 클래스를 주석 처리 한 추상 클래스를 가지고 있습니다. 내가 스프링 부트 1.2를 실행할 때 예상대로 모든 것이 작동했다 -> 추상 클래스 스크립트는 자식 클래스 scipt보다 먼저 실행되었다. 하지만 스프링 부트 1.3으로 업그레이드 한 후에는 자식 클래스'@ Sql'이 추상 부모 클래스의'@Sql'을 무시하기 시작 했으므로 부모 클래스 스크립트는 실행되지 않습니다. 나는 지금 무엇을 해야할지 모르겠다./ –

+0

나는 이것에 대한 질문을 만들었으며, 여기에있다 : http://stackoverflow.com/questions/39296329/sub-classing-sql-annotated-class –

관련 문제