Pergunta

O que a sua configuração do Spring para testes de integração parecido usando um incorporado h2 fonte de dados e, opcionalmente, JUnit?

A minha primeira tentativa com um SingleConnectionDataSource basicamente funcionou, mas falhou em testes mais complicados onde você precisa de várias conexões ao mesmo tempo ou transações suspensas. Acho h2 em tcp modo de servidor baseado trabalho poder bem, mas isso não é provavelmente o modo de comunicação mais rápido para um banco de dados incorporado temporária na memória.

Quais são as possibilidades e as suas vantagens / desvantagens? Além disso, como você criar as tabelas / preencher o banco?


Update:. Deixe-nos especificar alguns requisitos concretos que são importantes para tais testes

  • O banco de dados deve ser temporário e na memória
  • A conexão provavelmente não deve usar tcp, por requisitos de velocidade
  • Seria bom se eu pudesse usar uma ferramenta de banco de dados para inspecionar o conteúdo do banco de dados durante a depuração
  • Temos de definir uma fonte de dados, uma vez que não pode usar a fonte de dados servidores de aplicação em testes de unidade
Foi útil?

Solução

Com a reserva de que eu não sei se há alguma ferramenta que pode inspecionar o banco de dados, eu acho que uma solução simples seria usar o banco de dados Primavera incorporado ( 3.1.x docs , docs atuais ) que suporta HSQL, H2, e Derby.

Usando H2, a sua configuração xml seria parecido com o seguinte:

<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>

Se você preferir configuração baseada em Java, você pode instanciar um DataSource como este (nota que EmbeddedDataBase estende DataSource):

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

As tabelas de banco de dados são criados pelo db-schema.sql roteiro e eles são preenchidos com dados de teste do db-test-data.sql script.

Não se esqueça de adicionar o driver de banco de dados H2 ao seu classpath.

Outras dicas

I incluem actualmente, em um springconfig-arquivo somente teste como uma fonte de dados:

<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>

Criação / eliminação de tabelas pode ser feito usando executeSqlScript ao substituir AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction ou com SimpleJdbcTestUtils.executeSqlScript em local apropriado.

Comparar também desta postagem .

H2 vem com um built-in implementação pool de conexão. O XML a seguir fornece um exemplo de usá-lo como um feijão fonte de dados sem a necessidade de introduzir dependências adicionais sobre DBCP ou C3P0:

<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> 

O banco de dados irá ser desligado chamando um método dispor quando da mola de contexto aplicativo fecha.

Eu acho que é melhor usar sua implementação DataSource produção (apenas com diferentes string de conexão) para a unidade-testes.

De qualquer forma "falhou em testes mais complicados" não dá informações suficientes para uma resposta mais detalhada.

(Auto-anúncio: verificar isso )

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top