2013-07-06 3 views
20

나의 다음 문제 테스트 스프링 서비스 계층은 다음과 같습니다 한 번만 전에 모든 @Test 방법을 데이터베이스를 채 웁니다 스크립트를 호출하는 방법 :스프링 테스트에서 @Test 메소드보다 한 번만 데이터베이스를 채우는 방법은 무엇입니까? junit4와

JdbcTestUtils.executeSqlScript(jdbcTemplate(), new FileSystemResource(
"src/main/resources/sql/mysql/javahelp-insert.sql"), false); 

나는 노력을 : 를 내가 한 번 모든 @Tests하기 전에이 작업을 실행하려면 내 GenericServiceTest 클래스 (테스트 클래스에 의해 확장)에서 @PostConstruct를 사용합니다. @PostConstruct는 매번 @Test 메서드가 호출되기 전에 매번 호출됩니다. 흥미로운 점은 GenericServiceTest의 @Autowired 주석이 달린 메소드조차도 @Test 메소드를 호출하기 전에 호출된다는 것입니다.

모든 테스트 클래스 전에 데이터베이스를 채우고 싶지는 않지만 스프링 테스트 시작시 한 번만 채우고 싶습니다.

스프링 테스트 프레임 워크와 junit4를 사용하여 @Test 메소드를 한 번만 실행하는 방법은 무엇입니까?

고맙습니다!

답변

12

사용 스프링스 임베디드 데이터베이스 지원

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:myScript.sql"/> 
    <jdbc:script location="classpath:otherScript.sql"/> 
</jdbc:embedded-database> 

또는 스프링스 초기화 데이터베이스 지원

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="classpath:myScript.sql"/> 
    <jdbc:script location="classpath:otherScript.sql"/> 
</jdbc:initialize-database> 

@see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-embedded-database-support

+0

응답 해 주셔서 감사합니다. 나는 그것을 밖으로 시도해야합니다! –

+0

@Volodymyr Levytskyi : 작동하는 경우이 대답을 수락하십시오. – Ralph

+0

는 MySQL5에서 작동합니다! –

10

건물 Alfredos의 대답에,이 호출하지 않고 데이터베이스 정보를 삽입하는 방법입니다 내장 데이터베이스의 기본 스크립트 예를 들어, 이것은 적어도 테스트에서 자동으로 DDL을 빌드하고자 할 때 유용 할 수 있습니다.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"/applicationContext.xml"}) 
public class TestClass { 

    @Autowired 
    private ApplicationContext ctx; 

    private JdbcTemplate template; 

    @Autowired 
    public void setDataSource(DataSource dataSource) { 
     template = new JdbcTemplate(dataSource); 
    } 

    private static boolean isInitialized = false; 

    @Before 
    public void runOnce() { 
     if (isInitialized) return; 
     System.out.println("Initializing database"); 

     String script = "classpath:script.sql"; 
     Resource resource = ctx.getResource(script); 
     JdbcTestUtils.executeSqlScript(template, resource, true);    
     isInitialized = true; 
    } 
} 

이 방법은 runOnce() 방법은 한 번만 테스트 실행을위한라고합니다. isInitialized을 인스턴스 필드 (비 정적)로 만들면 모든 테스트를 수행하기 전에 메서드가 호출됩니다. 이렇게하면 필요한 경우 모든 테스트를 실행하기 전에 테이블을 삭제하거나 다시 채울 수 있습니다.

이 방법은 여전히 ​​빠르고 간단하며 데이터베이스를 처리 할 수있는 합리적인 방법은 Ralph의 답변에 따른 것입니다.

+1

'JdbcTestUtils.executeSqlScript (template, resource, true)'는 최근 버전의 Spring에서는 더 이상 사용되지 않습니다. 대신'org.springframework.jdbc.datasource.init.DatabasePopulator'를 사용해야합니다 ('ResourceDatabasePopulator'와'DatabasePopulatorUtils') – Tugdual