如何指示 Maven 忽略我的主要/资源/持久性.xml而支持测试/...?

2022-09-03 07:43:21

为了测试,我有两个文件:persistence.xml

  • src/main/resources/META-INF/persistence.xml
  • src/test/resources/META-INF/persistence.xml

如何指示 Maven 在测试期间忽略第一个文件?现在它没有被忽略,因为OpenEJB说:

ERROR - FAIL ... Finder: @PersistenceContext unitName has multiple matches: 
unitName "abc" has 2 possible matches.

答案 1

查看备用描述符功能,该功能针对您要执行的操作。

请尝试以下设置:

  • src/main/resources/META-INF/persistence.xml
  • src/main/resources/META-INF/test.persistence.xml

然后,您可以通过将 System 或 InitialContext 属性设置为test.persistence.xmlopenejb.altdd.prefixtest

另一种可能的解决方案可能是在测试中重写持久性单元属性。通过这种方法,您可以避免需要一秒钟,这可能很好,因为保持两个可能是一种痛苦。persistence.xml

您可以使用 Maven 方法,但请注意,根据规范,持久性提供程序只会在找到 的确切 jar 或目录中查找(也称为扫描)bean。因此,请敏锐地意识到,在Maven中,这是两个不同的位置:@Entitypersistence.xml

  • target/classes
  • target/test-classes

编辑有关覆盖功能的更多详细信息

您可以通过系统属性或初始上下文属性(包括 jndi.properties 文件)覆盖测试设置中的任何属性。格式为:

<unit-name>.<property>=<value>

例如,例如:persistence.xml

<persistence>
  <persistence-unit name="movie-unit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>movieDatabase</jta-data-source>
    <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

可以在测试用例中重写添加持久性单元属性。目前没有删除它们的设施(如果您有需要,请告诉我们 - 到目前为止还没有真正出现)。

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");

p.put("movie-unit.hibernate.hbm2ddl.auto", "update");
p.put("movie-unit.hibernate.dialect", "org.hibernate.dialect.HSQLDialect");

context = new InitialContext(p);

或者通过文件jndi.properties

java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory
movie-unit.hibernate.hbm2ddl.auto = update
movie-unit.hibernate.dialect = org.hibernate.dialect.HSQLDialect

答案 2

我认为您可以在pom中创建两个配置文件.xml:

<properties>
  <environment>dev</environment>
</properties>
<profiles>
  <profile>
    <id>prod</id>
    <properties>
      <environment>test</environment>
    </properties>
  </profile>
</profiles>

之后,在 src 文件夹中,创建两个名为 dev/resoruces 和 test/resources 的文件夹,并将不同的资源复制到该文件夹中。之后,添加类似如下的内容:

<resources>
  <resource>
    <directory>${basedir}/src/main/resources</directory>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>${basedir}/src/main/${environment}/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

${basedir} 取决于命令行参数,它可以是 test 或 dev。你像这样运行maven命令:mvn clean package -P test


推荐