在EE6 / CDI / JPA项目中,src/test/resources/META-INF/persistence.xml
无需任何进一步配置就可以很好地进行测试。
在Spring中使用JPA时,以下将在用于测试的应用程序上下文中起作用:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />
<property name="persistenceUnitName" value="myTestPersistenceUnit" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
</property>
</bean>
在这里,/src/test/resources/META-INF/persistence.xml
(复制到target/test-classes
)比/src/main/resources/META-INF/persistence.xml
(复制到target/classes
)更可取。
不幸的是,persistence.xml
文件的位置也确定了所谓的“持久性单元的根”,然后确定了要扫描哪些类的@Entity
注释。因此,使用/src/test/resources/META-INF/persistence.xml
将扫描中的类target/test-classes
,而不是中的类target/classes
(需要测试的类将存在)。
因此,为了进行测试,需要向显式添加<class>
条目persistence.xml
以避免java.lang.IllegalArgumentException: Not an entity: class ...
。需要<class>
的条目可以通过使用不同的文件名,如避免persistence-TEST.xml
,并把该文件中的非常相同的文件夹常规persistence.xml
文件。然后可以从您的测试文件夹中引用Spring上下文<property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" />
,Spring会在中为您找到它src/main
。
作为一种替代方法,persistence.xml
对于实际的应用程序和测试,可以保持相同,并且仅在中定义一个src/main
。大多数配置(例如驱动程序,方言和可选凭据)都可以在Spring上下文中完成。也hibernate.hbm2ddl.auto
可以在上下文中传递诸如之类的设置:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="#{myConfig['db.driver']}" />
<property name="url" value="#{myConfig['db.url']}" />
<property name="username" value="#{myConfig['db.username']}" />
<property name="password" value="#{myConfig['db.password']}" />
</bean>
<bean id="jpaAdaptor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="#{myConfig['db.dialect']}" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">#{myConfig['db.ddl']}</prop>
<prop key="hibernate.show_sql">#{myConfig['db.showSql']}</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>