Тест интеграции Spring / JTA / JPA DAO не откатывается? - PullRequest
4 голосов
/ 27 июня 2010

Мои интеграционные тесты DAO не пройдены, поскольку объекты, созданные во время тестов, все еще находятся в базе данных в начале следующего теста.Точно такое же поведение наблюдается как в MySQL 5, так и в H2.

Классы тестов снабжены комментариями:

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

Конфигурация компонента транзакции в контексте приложения тестирования выглядит следующим образом:

<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 об откате какЧто ж.Но, честно говоря, журналы настолько огромны и сложны, что я мог бы что-то упустить ...

И все же вставленные данные испытаний остаются!Есть какие-нибудь подсказки?

Ответы [ 2 ]

7 голосов
/ 30 июня 2010

Оказалось, что мой источник данных 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>
1 голос
/ 28 июня 2010

Я думаю, вам нужно будет детально просмотреть журналы. Может случиться так, что откаты, которые вы видите, работают, за исключением того, что кто-то еще выполнил коммит первым. Я также не вижу ничего в вашем коде, что указывает на автоматический откат. И это должно происходить в конце каждого теста. Если вы используете откат на основе тайм-аута, возможно, второй тест выполняется до истечения тайм-аута, поэтому он видит данные до его отката.

Множество вариантов здесь есть: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...