문제

통합 테스트를 위한 Spring 구성은 다음과 같습니다. 임베디드 h2 데이터소스 그리고 선택적으로 JUnit?

내 첫 번째 시도는 SingleConnectionDataSource 기본적으로 작동했지만 동시에 여러 연결이 필요하거나 트랜잭션이 일시 중단되는 더 복잡한 테스트에서는 실패했습니다.내 생각엔 h2가 들어갈 것 같아 TCP 기반 서버 모드 잘 작동할 수도 있지만 이는 아마도 메모리에 내장된 임시 데이터베이스에 대한 가장 빠른 통신 모드는 아닐 것입니다.

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


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

  • 데이터베이스는 임시로 메모리에 있어야 합니다.
  • 속도 요구 사항 때문에 연결에서 tcp를 사용하면 안 됩니다.
  • 디버깅 중에 데이터베이스 도구를 사용하여 데이터베이스 내용을 검사할 수 있다면 좋을 것 같습니다.
  • 단위 테스트에서는 애플리케이션 서버 데이터 소스를 사용할 수 없으므로 데이터 소스를 정의해야 합니다.
도움이 되었습니까?

해결책

데이터베이스를 검사 할 수있는 도구가 있는지 알 수없는 예약을 사용하면 간단한 솔루션은 스프링 내장 데이터베이스를 사용하는 것이라고 생각합니다 (3.1.x 문서, 현재 문서) HSQL, H2 및 Derby를 지원합니다.

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 데이터베이스 드라이버를 클래스 경로에 추가하는 것을 잊지 마십시오.

다른 팁

현재 데이터 소스로 테스트 전용 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>

테이블 작성 / 드롭은 재정의 할 때 ExecutesQlScript를 사용하여 수행 할 수 있습니다. AbstractAntationAwaretransactionalTests.onSetUpbeforeTransaction, 또는 함께 SimpleJdBcTestUtils.ExecutesQlScript 적절한 장소에서.

비교하십시오 이 게시물.

H2는 내장 연결 풀 구현과 함께 번들로 제공됩니다. 다음 XML은 DBCP 또는 C3P0에 추가 종속성을 도입 할 필요없이 데이터 소스 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> 

스프링 애플리케이션 컨텍스트가 닫히면 Dispose 메소드를 호출하여 데이터베이스가 종료됩니다.

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

어쨌든 "더 복잡한 테스트에 실패했습니다"는 더 자세한 답변을 위한 충분한 정보를 제공하지 않습니다.

(자체 광고 : 이것을 확인하세요)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top