2

我正在使用 Spring (3.1.x)、JSF 2、JPA 2 (Hibernate Provider) 为 tomcat 6.x 开发 Web 应用程序。我想测试我的 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>

这是我第一次进行测试,当我测试时我不想使用相同的持久性单元。我听说过使用 xml 数据的 dbunit,但我不明白如何在测试期间更改持久性单元。你能帮我或给我一些例子,教程。

谢谢。

4

1 回答 1

2

也许本教程会有所帮助。顺便说一句,有一个有趣的 Spring 特性可以满足您的需求 - 嵌入式数据库支持。所以,我通常只使用以下构造来创建内存中的 H2 db,使用 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 用作 EntityManagerFactory bean 的数据源:

<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 嵌入式数据库支持”一章。

于 2011-12-29T07:41:13.267 回答