Весенние транзакционные юнит-тесты - запросы Hibernate не откатываются - PullRequest
0 голосов
/ 13 июля 2010

Я использую Spring 3 и Hibernate 3.5, я не заставляю свои транзакции откатываться в тестовой среде, что меня беспокоит, что они также не будут откатаны в рабочей среде.

Тестовый класс:

@ContextConfiguration(loader = MyConfigurationLoader.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class DashTemplateRepositoryTest extends AbstractMulitpleDataSourceSpringContextTests {

    @Autowired
    DashTemplateRepository dashTemplateRepository;

    @Test
    public void testSaveCategory() {
        int initialCount = getCategoryCount();

        Category c = new Category();
        c.setName("mynewcategory");
        dashTemplateRepository.save(c);

        assertEquals(initialCount + 1, getCategoryCount());
    }
}

Что расширяет пользовательский класс:

public abstract class AbstractTransactionalTemplateTests extends AbstractTransactionalJUnit4SpringContextTests {

    protected SimpleJdbcTemplate simpleJdbcTemplate;

    @Autowired
    DashTemplateRepository dashTemplateRepository;

    @Resource(name = "dashDataSource")
    public void setDataSource(final DataSource dataSource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
    } ..snip...

ОБНОВЛЕНИЕ: мне нужно было выполнить вставку simpleJdbcTemplate, потому что у меня есть несколько источников данных, и по умолчанию этот тестовый класс не может с этим справиться, я не смог найти решение с поддержкой Spring, но на весенних форумах участник опубликовал вкладчик этот обходной путь. Проблема с откатом существовала до того, как я извлек этот суперкласс. Я предполагаю, что проблема является более простой, чем, Hibernate, кажется, не знает о диспетчере транзакций, есть ли способ, которым я могу доказать это?

Боб источника данных:

<bean id="dashDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/dashtemplate"/>
        <property name="username" .../>
        <property name="password" .../>
    </bean>

Мой Context-text.xml (упрощенно, некоторые из них пропущены)

<!-- Hibernate -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dashDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.dash.Category</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
    </bean>

    <bean id="dashTemplateRepository" class="com.wdp.DashTemplateRepositoryHibernateTemplateImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

Тест выполняется нормально, мой объект сохраняется, но он никогда не откатывается, также не возникает никаких ошибок

Ответы [ 2 ]

6 голосов
/ 22 февраля 2011

Проблема была в том, что MySQL использовал MyISAM вместо InnoDB - откат не поддерживается MyISAM

2 голосов
/ 20 июля 2010

Вот так выглядит мой базовый тестовый класс, и он отлично работает для меня.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/context.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {
//....
}
...