4

次のように、階層化されたアーキテクチャに基づいて定義された一連の Maven プロジェクトがあります。

1- ドメイン

-src/main/java
-src/main/resources/META-INF/
-src/test/java
-src/test/resources/META-INF/

2- リポジトリ (ドメインによる)

-src/main/java
-src/main/resources/META-INF/
-src/test/java
-src/test/resources/spring/my-appcontext.xml
-src/test/resources/META-INF/orm.xml

リポジトリ レイヤーでの単体テストでは、DbUnit を hsql インメモリ データベースと組み合わせて使用​​します。永続化構成は、Spring によって構成された JPA/Hibernate に基づいています。テストで使用しているスプリング構成の例を以下に示します。

<!-- our datasource -->
<bean id="myDatasource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="${datasource.driverClassName}" />
  <property name="url" value="${datasource.url}" />
  <property name="username" value="${datasource.username}" />
  <property name="password" value="${datasource.password}" />
</bean>

<!-- let hibernate be in between the database and JPA -->
<bean id="myJpaVendorAdapter"
   class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
   <property name="database" value="${jpa.database}" />
   <property name="showSql" value="${jpa.showSql}" />
   <property name="generateDdl" value="${jpa.generateDdl}" />
   <property name="databasePlatform" value="${jpa.databasePlatform}" />
</bean>
<!-- entityManagerFactory - CONTAINER-managed -->
<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      p:dataSource-ref="molecularanalysisDatasource"
      p:mappingResources="${jpa.orm}"
      p:packagesToScan="com.mypackages.domain">
      <property name="jpaVendorAdapter" ref="myJpaVendorAdapter" />
      <property name="jpaProperties">
    <props>
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
      <prop key="hibernate.showSql">${hibernate.showSql}</prop>
      <prop key="hibernate.formatSql">${hibernate.formatSql}</prop>
      <prop key="dialect">${hibernate.dialect}</prop>
      <prop key="hibernate.connection.driver_class">${datasource.driverClass}</prop>
          <prop key="hibernate.connection.url">${datasource.url}</prop>
      <prop key="hibernate.connection.username">${datasource.username}</prop>
      <prop key="hibernate.connection.password">${datasource.password}</prop>
    </props>
      </property>
</bean>
<bean id="dbUnitDatabaseConfig"    
   class="com.github.springtestdbunit.bean.DatabaseConfigBean">
   <property name="qualifiedTableNames" value="true" />
</bean>
<bean id="dbUnitDatabaseConnection"
   class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean">
 <property name="dataSource" ref="myDatasource" />
 <property name="databaseConfig" ref="dbUnitDatabaseConfig" />
 <property name="schema" value="${datasource.schema}" />
</bean>

テスト スコープで使用している orm.xml は、テーブルがデフォルトのカタログ名 PUBLIC で hsqldb に作成されることを確認します。言い換えると、テスト スコープで orm.xml を使用すると、テストがドメイン エンティティで定義された特定のカタログ/スキーマ名を気にせず、hsqldb の下でデフォルトのものを使用するようになります (これは、hsql が 1 つのカタログ、つまり PUBLIC のみを許可するためです)。テスト中にテーブルを作成するとき。

Eclipse を使用してテストを実行すると、「src/test/resources/META-INF/orm.xml」の下の orm.xml が見つかり、entitymanagerfactory によって使用されて hsqldb にテーブルが作成されます。ただし、maven を使用してテストを実行すると、orm.xml が取得されず、その結果、entitymanager は実際のカタログ名とスキーマ名を使用してテーブル (エンティティ) を作成しようとしますが、hsqldb では 1 つしかないため失敗します。カタログ、つまり PUBLIC。

春にデバッグを有効にした後、この理由は、Jpa/Hibernate および永続化オブジェクトを構成するときに、entitymanagerfactory が別の「ルート URL」を使用して構成ファイルを検索するためであることに気付きました。

Eclipse を介してテストを実行する場合、エンティティ マネージャーは、META-INF/orm.xml がある "target/test-classes/" ディレクトリを使用します。Maven を介してテストを実行する場合、エンティティ マネージャーは domain.jar を使用しますが、META-INF/orm.xml は含まれません (これは統合モジュール内のテストでのみ定義されるため)。デバッグ情報の下:

1- Eclipse を介したテストの実行:

 [main] DEBUG - Processing PersistenceUnitInfo [
    name: default
    persistence provider classname: null
    classloader: sun.misc.Launcher$AppClassLoader@35a16869
    Temporary classloader:
        org.springframework.instrument.classloading.SimpleThrowawayClassLoader@706f2039
         excludeUnlistedClasses: true
         JTA datasource: null
         Transaction type: RESOURCE_LOCAL
         PU root URL: file:/C:/DEVELOPMENT/project/integration/test-classes/
         Shared Cache Mode: UNSPECIFIED
         Validation Mode: AUTO
         Jar files URLs []

2- Maven によるテストの実行:

[main] DEBUG - Processing PersistenceUnitInfo [
   name: default
    persistence provider classname: null
    classloader: sun.misc.Launcher$AppClassLoader@35a16869
    Temporary classloader:
    org.springframework.instrument.classloading.SimpleThrowawayClassLoader@706f2039
    excludeUnlistedClasses: true
    JTA datasource: null
    Transaction type: RESOURCE_LOCAL
    PU root URL: file:/C:/DEVELOPMENT/project/maven-repository/domain/domain.jar
    Shared Cache Mode: UNSPECIFIED
    Validation Mode: AUTO
    Jar files URLs []

私がうまくいかないのは、orm.xmlファイルをスキャンするときにentitymanagerにMETA-INF/orm.xmlを含める方法です。テストでMavenでこれを行う方法を知っている人はいますか? この設定はテスト コンテキストでのみ使用する必要があるため、この orm.xml をドメイン (src/main/resources/META-INF) に追加しても役に立ちません。

4

0 に答える 0