4

テスト中に作成されたエンティティが次のテストの開始時にデータベースに残っているため、DAO統合テストは失敗します。MySQL5とH2の両方でまったく同じ動作が見られます。

テストクラスには次の注釈が付けられています。

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { "/testPersist-applicationContext.xml" })

テストアプリケーションコンテキストでのトランザクションBeanの構成は次のとおりです。

<tx:annotation-driven />

<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="atomikosTransactionManager" />
    <property name="userTransaction" ref="atomikosUserTransaction" />
</bean>

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
    <property name="forceShutdown" value="false" />
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <property name="transactionTimeout" value="300" />
</bean>

エンティティマネージャは次のように構成されています。

<bean id="myappTestLocalEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myapp" />
    <property name="persistenceUnitPostProcessors">
        <bean                class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor">
        <property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" />
        </bean>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
            <property name="database" value="$DS{hibernate.database}" />
            <property name="databasePlatform" value="$DS{hibernate.dialect}" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
            </prop>
            <prop key="hibernate.format_sql">true"</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            </props>
    </property>
</bean>

<context:annotation-config />

ログファイルのすべてが正常であるように見えます...ロールバックについてのSpringからのメッセージと、ロールバックについてのAtomikosからのメッセージも見ることができます。しかし率直に言って、ログは非常に巨大で複雑なので、私は簡単に何かを見逃す可能性があります...

それでも、挿入されたテストデータは残ります!手がかりはありますか?

4

2 に答える 2

7

私の C3P0 JDBC データ ソースは XA に対応していないため、トランザクションに参加していないことが判明しました。エラーやログ ファイルに警告が表示されなかった理由はわかりません。それにもかかわらず、XA 対応のデータ ソースを使用できない理由については、ここで非常にうまく説明されています。データ ソースは XA 対応である必要はありません。XA 対応である必要があります。

C3P0 データ ソースを次のものに置き換えると、問題が解決しました。

<bean id="myappJTANonXADataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
        <property name="uniqueResourceName" value="myappDatabase" />
        <property name="driverClassName" value="$DS{hibernate.connection.driver_class}" />
        <property name="url" value="$DS{hibernate.connection.url}" />
        <property name="user" value="$DS{hibernate.connection.username}" />
        <property name="password" value="$DS{hibernate.connection.password}" />
        <property name="maxPoolSize" value="20" />
        <property name="reapTimeout" value="300" />
</bean>
于 2010-06-29T22:02:46.200 に答える
1

ログを詳細に調べる必要があると思います。他の何かが最初にコミットを実行したことを除いて、表示されているロールバックが機能している可能性があります。また、コードには自動ロールバックを示すものは何も表示されません。そして、それは各テストの最後に発生するはずです。タイムアウト ベースのロールバックに依存している場合、タイムアウトが発生する前に 2 番目のテストが実行されている可能性があるため、ロールバックされる前にデータが表示されます。

ここには多くのオプションがあります:-)

于 2010-06-28T03:56:37.270 に答える