首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Maven中配置JPA进行测试

如何在Maven中配置JPA进行测试
EN

Stack Overflow用户
提问于 2008-12-22 04:08:45
回答 12查看 59.8K关注 0票数 69

有没有办法在Maven项目中设置第二个persistence.xml文件,以便将其用于测试而不是用于部署的普通文件?

我尝试在src/test/resources/META-INF中放置一个类,它会被复制到persistence.xml /test-classes/META-INF中,但是似乎首选目标/classes/META-INF(来自src/main/resources的副本),尽管mvn -X test以正确的顺序列出了类路径条目:

代码语言:javascript
复制
[DEBUG] Test Classpath :
[DEBUG]   /home/uqpbecke/dev/NetBeansProjects/UserManager/target/test-classes
[DEBUG]   /home/uqpbecke/dev/NetBeansProjects/UserManager/target/classes
[DEBUG]   /home/uqpbecke/.m2/repository/junit/junit/4.5/junit-4.5.jar
...

我希望能够对简单的hsqldb配置运行测试,而不必更改JPA配置的部署版本,理想情况下,直接在项目签出后运行,而不需要任何本地调整。

EN

回答 12

Stack Overflow用户

发布于 2009-07-24 20:01:14

下面的方法将适用于Maven 2.1+ (在此之前,在测试和包之间没有可以绑定执行的阶段)。

您可以使用maven-antrun-plugin在测试期间将persistence.xml替换为测试版本,然后在打包项目之前恢复正确的版本。

此示例假设生产版本为src/main/resources/META-INF/persistence.xml,测试版本为src/ test /resources/META-INF/persistence.xml,因此它们将分别复制到target/classes/META-INF和target/test-classes/META-INF。

将其封装到mojo中会更优雅,但由于您只复制一个文件,这似乎有点过头了。

代码语言:javascript
复制
<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.3</version>
  <executions>
    <execution>
      <id>copy-test-persistence</id>
      <phase>process-test-resources</phase>
      <configuration>
        <tasks>
          <!--backup the "proper" persistence.xml-->
          <copy file="${project.build.outputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml.proper"/>
          <!--replace the "proper" persistence.xml with the "test" version-->
          <copy file="${project.build.testOutputDirectory}/META-INF/persistence.xml" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
    <execution>
      <id>restore-persistence</id>
      <phase>prepare-package</phase>
      <configuration>
        <tasks>
          <!--restore the "proper" persistence.xml-->
          <copy file="${project.build.outputDirectory}/META-INF/persistence.xml.proper" tofile="${project.build.outputDirectory}/META-INF/persistence.xml"/>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
</plugin>
票数 26
EN

Stack Overflow用户

发布于 2010-06-01 19:55:40

在EE6/CDI/JPA项目中,不需要任何进一步的配置就可以很好地获取测试src/test/resources/META-INF/persistence.xml

在Spring中使用JPA时,以下内容适用于用于测试的应用程序上下文:

代码语言:javascript
复制
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!--
        JPA requires META-INF/persistence.xml, but somehow prefers the one
        in classes/META-INF over the one in test-classes/META-INF. Spring
        to the rescue, as it allows for setting things differently, like by
        referring to "classpath:persistence-TEST.xml". Or, simply referring
        to "META-INF/persistence.xml" makes JPA use the test version too: 
    -->
    <property name="persistenceXmlLocation" value="META-INF/persistence.xml" />

    <!-- As defined in /src/test/resources/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文件的位置也决定了所谓的"persistence unit's root",然后它决定了扫描哪些类来查找@Entity注释。因此,使用/src/test/resources/META-INF/persistence.xml将扫描target/test-classes中的类,而不是target/classes中的类(需要测试的类将位于其中)。

因此,为了进行测试,需要显式地将<class>条目添加到persistence.xml中,以避免java.lang.IllegalArgumentException: Not an entity: class ...。可以通过使用不同的文件名(如persistence-TEST.xml )来避免需要<class>条目,并将该文件放在与常规persistence.xml文件完全相同的文件夹中。然后,测试文件夹中的Spring context可以直接引用<property name="persistenceXmlLocation" value="META-INF/persistence-TEST.xml" />,Spring将在src/main中为您找到它。

作为另一种选择,可以在实际应用程序和测试中保持persistence.xml相同,并且只在src/main中定义一个。大多数配置,如驱动程序、方言和可选凭据,都可以在Spring上下文中完成。此外,诸如hibernate.hbm2ddl.auto之类的设置也可以为passed in the context

代码语言:javascript
复制
<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- For example: com.mysql.jdbc.Driver or org.h2.Driver -->
    <property name="driverClassName" value="#{myConfig['db.driver']}" />
    <!-- For example: jdbc:mysql://localhost:3306/myDbName or 
        jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 -->
    <property name="url" value="#{myConfig['db.url']}" />
    <!-- Ignored for H2 -->
    <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">
    <!-- For example: org.hibernate.dialect.MySQL5Dialect or 
        org.hibernate.dialect.H2Dialect -->
    <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>
            <!-- For example: validate, update, create or create-drop -->
            <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>
票数 21
EN

Stack Overflow用户

发布于 2008-12-22 05:34:30

多个persistence.xml文件似乎是JPA的一个普遍问题,只有通过类加载技巧才能解决。

我的一个变通方法是在一个persistence.xml文件中定义多个持久化单元,然后确保您的部署和测试代码使用不同的绑定(在Spring中,您可以在实体管理器工厂上设置"persistenceUnitName“属性)。它会用测试配置污染您的部署文件,但是如果您不介意它正常工作的话。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/385532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档