복붙노트

[SPRING] 테스트 용 임베디드 H2 데이터베이스 용 스프링 구성

SPRING

테스트 용 임베디드 H2 데이터베이스 용 스프링 구성

임베디드 h2 데이터 소스와 선택적으로 JUnit을 사용하여 통합 테스트를위한 Spring 구성이 어떻게 생겼습니까?

기본적으로 SingleConnectionDataSource에 대한 첫 번째 시도가 성공했지만 동시에 여러 연결이 필요하거나 트랜잭션이 일시 중단 된 더 복잡한 테스트에서는 실패했습니다. 나는 TCP 기반 서버 모드에서 h2가 잘 작동한다고 생각하지만, 이것은 아마도 메모리에 임시 임베디드 데이터베이스를위한 가장 빠른 통신 모드가 아닙니다.

가능성과 장점 / 단점은 무엇입니까? 또한 어떻게 테이블을 생성하고 데이터베이스를 채우는가?

업데이트 : 이러한 테스트에 중요한 몇 가지 구체적인 요구 사항을 지정해 보겠습니다.

해결법

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

    1.데이터베이스를 검사 할 수있는 도구가 있는지 모르겠다는 이유로, HSQL, H2 및 Derby를 지원하는 Spring 임베디드 데이터베이스 (3.1.x 문서, 현재 문서)를 사용하는 것이 간단한 해결책이라고 생각합니다. .

    데이터베이스를 검사 할 수있는 도구가 있는지 모르겠다는 이유로, HSQL, H2 및 Derby를 지원하는 Spring 임베디드 데이터베이스 (3.1.x 문서, 현재 문서)를 사용하는 것이 간단한 해결책이라고 생각합니다. .

    H2를 사용하면 XML 구성은 다음과 같이 나타납니다.

    <jdbc:embedded-database id="dataSource" type="H2">
        <jdbc:script location="classpath:db-schema.sql"/>
        <jdbc:script location="classpath:db-test-data.sql"/>
    </jdbc:embedded-database>
    

    Java 기반 구성을 선호하는 경우 이와 같이 DataSource를 인스턴스화 할 수 있습니다 (EmbeddedDataBase가 DataSource를 확장 함).

    @Bean(destroyMethod = "shutdown")
    public EmbeddedDatabase dataSource() {
        return new EmbeddedDatabaseBuilder().
                setType(EmbeddedDatabaseType.H2).
                addScript("db-schema.sql").
                addScript("db-test-data.sql").
                build();
    }
    

    데이터베이스 테이블은 db-schema.sql 스크립트에 의해 작성되며 db-test-data.sql 스크립트의 테스트 데이터로 채워집니다.

    클래스 경로에 H2 데이터베이스 드라이버를 추가하는 것을 잊지 마십시오.

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

    2.현재 테스트 전용 springconfig-file에 데이터 소스를 포함하고 있습니다 :

    현재 테스트 전용 springconfig-file에 데이터 소스를 포함하고 있습니다 :

    <bean id="database.dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <constructor-arg>
            <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
                <property name="driverClass" value="org.h2.Driver" />
                <property name="url"
                    value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2" />
            </bean>
        </constructor-arg>
    </bean>
    
    <!-- provides a H2 console to look into the db if necessary -->
    <bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
        factory-method="createWebServer" depends-on="database.dataSource" 
        init-method="start" lazy-init="false">
        <constructor-arg value="-web,-webPort,11111" />
    </bean>
    

    AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction을 오버라이드 할 때 executeSqlScript를 사용하거나 적절한 위치에 SimpleJdbcTestUtils.executeSqlScript를 사용하여 테이블을 생성 / 삭제할 수 있습니다.

    이 게시물을 비교해보십시오.

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

    3.H2는 기본 제공 연결 풀 구현과 함께 번들로 제공됩니다. 다음 XML은 DBCP 또는 C3P0에 대한 추가 종속성을 도입 할 필요없이 Datasource bean으로서이를 사용하는 예제를 제공합니다.

    H2는 기본 제공 연결 풀 구현과 함께 번들로 제공됩니다. 다음 XML은 DBCP 또는 C3P0에 대한 추가 종속성을 도입 할 필요없이 Datasource bean으로서이를 사용하는 예제를 제공합니다.

    <bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool" destroy-method="dispose">
        <constructor-arg>
            <bean class="org.h2.jdbcx.JdbcDataSource">
                <property name="URL" value="jdbc:h2:dbname"/>
                <property name="user" value="user"/>
                <property name="password" value="password"/>
             </bean>
        </constructor-arg>
    </bean> 
    

    Spring 응용 프로그램 컨텍스트가 닫힐 때 dispose 메서드를 호출하여 데이터베이스를 종료합니다.

  4. ==============================

    4.단위 테스트를 위해 프로덕션 DataSource 구현 (다른 연결 문자열 만 사용)을 사용하는 것이 가장 좋습니다.

    단위 테스트를 위해 프로덕션 DataSource 구현 (다른 연결 문자열 만 사용)을 사용하는 것이 가장 좋습니다.

    어쨌든 "더 복잡한 테스트를 통과하지 못했습니다."라는 대답은 자세한 답변을 얻기에 충분한 정보를 제공하지 못합니다.

    (자체 광고 : 이것을 확인하십시오)

  5. from https://stackoverflow.com/questions/2012292/spring-configuration-for-embedded-h2-database-for-tests by cc-by-sa and MIT license