Тестирование Spring-JPA

Я разрабатываю веб-приложение с использованием Spring (3.1.x), JSF 2, JPA 2 (Hibernate Provider) для tomcat 6.x. Я хочу протестировать свои классы DAO.

В моем классе DAO: я делаю это:

@PersistenceContext
private EntityManager entityManager;

В конфигурации Spring;

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="OpenPU" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

В persistence.xml

<persistence-unit name="OpenPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>java:comp/env/jdbc/mysql_open</non-jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.transaction.flush_before_completion" value="true"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
        <property name="hibernate.connection.zeroDateTimeBehavior" value="convertToNull"/>
    </properties>
</persistence-unit>

Это первый раз, когда я делаю тест, и когда я тестирую, я не хочу использовать одну и ту же единицу сохранения состояния. Я слышал о dbunit для использования XML-данных, но не понимаю, как изменить блок сохранения во время теста. Можете ли вы мне помочь или привести пример, учебник.

Спасибо вам.


person La Chamelle    schedule 13.12.2011    source источник


Ответы (1)


Возможно, этот учебник поможет . Кстати, есть одна интересная функция Spring, которая соответствует вашим потребностям - поддержка встроенных баз данных. Итак, я обычно использую следующую конструкцию для создания базы данных H2 в памяти, создания схемы с помощью schema.sql и заполнения ее некоторыми данными из test-data.sql:

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

Затем вы можете использовать этот bean-компонент в качестве источника данных для вашего bean-компонента EntityManagerFactory:

<bean id="entityManagerFactory"
   class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
   p:dataSource-ref="dataSource"
   p:persistence-xml-location="classpath:META-INF/persistence.xml">           
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
            <property name="showSql" value="true" />
            <!-- other properties -->
        </bean>
    </property>
    <property name="persistenceUnitName" value="OpenPU" />
</bean>

Это очень удобный и лаконичный способ создания базы данных в памяти для тестов с помощью Spring. (не забудьте добавить H2 в путь к классам) См. документация для подробностей, глава "13.8 Поддержка встроенных баз данных".

person Grigory Katkov    schedule 29.12.2011
comment
что делать, если у вас нет скрипта schema.sql? - person KhaledE; 25.05.2012
comment
@KhaledE, просто используйте его без него <jdbc:embedded-database id="dataSource" type="H2" /> - person Grigory Katkov; 28.05.2012