次のように、階層化されたアーキテクチャに基づいて定義された一連の 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) に追加しても役に立ちません。