복붙노트

[SPRING] 스프링 테스트에서 @Test 메소드를 사용하기 전에 데이터베이스를 한 번만 채우는 방법은 무엇입니까?

SPRING

스프링 테스트에서 @Test 메소드를 사용하기 전에 데이터베이스를 한 번만 채우는 방법은 무엇입니까?

junit4를 사용하여 스프링 서비스 계층을 테스트하는 다음 문제는 다음과 같다. @Test 메서드를 사용하기 전에 데이터베이스를 한 번만 채우는 스크립트를 호출하는 방법 : 나는 이것을 한 번 실행하기 전에 @Tests :

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

내 GenericServiceTest 클래스 (테스트 클래스로 확장)에서 @PostConstruct를 사용하려고했습니다. @PostConstruct는 매번 @Test 메서드가 호출되기 전에 매번 호출됩니다. 흥미로운 점은 GenericServiceTest의 @Autowired 주석이 달린 메소드조차도 @Test 메소드를 호출하기 전에 호출된다는 것입니다.

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

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

고맙습니다!

해결법

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

    1.스프링 내장 데이터베이스 지원 사용

    스프링 내장 데이터베이스 지원 사용

    <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

  2. ==============================

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

    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의 대답에 따른 것입니다.

  3. ==============================

    3.당신이 봄 부팅하는 경우에, 당신은 테스트를 거치기 전에 여러 스크립트를 언급 할 수 있습니다.

    당신이 봄 부팅하는 경우에, 당신은 테스트를 거치기 전에 여러 스크립트를 언급 할 수 있습니다.

    spring.datasource.data=classpath:accounts.sql, classpath:books.sql, classpath:reviews.sql
    
  4. from https://stackoverflow.com/questions/17505952/how-to-populate-database-only-once-before-test-methods-in-spring-test by cc-by-sa and MIT license