2011-06-14 95 views
5

我嘗試爲我的dao層設置一個Junit測試用例。 但是,我做不是希望測試數據實際上堅持到數據庫。@Transactional Spring Junit測試沒有做回滾

所以我想我應該做的事情,並在每次測試後回滾。 這給我留下了以下數據源設置:

<bean id="dataSource" 
    class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" 
    p:driverClass="org.postgresql.Driver" 
    p:jdbcUrl="jdbc:postgresql://***" 
    p:user="***" 
    p:password="***/> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
     p:dataSource-ref="dataSource" 
     p:packagesToScan="***" 
     p:hibernateProperties-ref="hibernateProps" /> 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

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

上述待測試的DAO類設置如下:

@Repository 
@Transactional 
@SuppressWarnings("unchecked") 
public class BallotBoxRepositoryHibernateImpl implements BallotBoxRepository { 

@Autowired 
private SessionFactory sessionFactory; 

    @Override 
    public void saveVote(DaoObject v) { 
    Session sess = sessionFactory.openSession(); 
    sess.beginTransaction(); 
    sess.save(v); 
    sess.getTransaction().commit(); 
    sess.close(); 
    } 
[...] 
} 

實際持續存在的工作確實工作很好。然而,預期回滾從未:

INFO main transaction.TransactionalTestExecutionListener:292 - Rolled back transaction after test execution for test context [...] 

的TransactionalTextExecutionListener定義如下:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"}) 
@TestExecutionListeners({WebTestExecutionerListener.class, DependencyInjectionTestExecutionListener.class, 
TransactionalTestExecutionListener.class}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class DaoTest { ... } 

我使用的是自動裝配Autowired成員訪問吾道方法:

@Autowired 
private BallotBoxRepository repo; 

TL; DR

JUnit測試用例即使在指出回滾已完成的情況下仍然保留測試數據。

+0

1.不要使用人工交易處理,使用Spring 2.檢查@Rollback註釋。 – abalogh 2011-06-14 11:21:23

回答

6

在你的情況基於Spring的事務管理不起作用,因爲你手動管理Hibernate事務。

爲了使用Spring的事務管理,你應該做到以下幾點:

@Override 
public void saveVote(DaoObject v) { 
    sessionFactory.getCurrentSession().save(v); 
} 

參見:

+0

親愛的神 - 那個解決方案很簡單。感謝您的鏈接! – chzbrgla 2011-06-14 11:24:35