2011-06-14 1 views
5

내 DAO 계층의 Junit 테스트 케이스를 설정하려고합니다. 그러나 나는 을 사용하지 않습니다. 실제로 테스트 데이터를 DB에 유지하려고합니다.@ 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이 정의를 다음과 같이

@Autowired 
private BallotBoxRepository repo; 

: 내 DAO의 메소드에 액세스하는 autowire가 멤버를 사용하고

@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 { ... } 

TL

JUnit 테스트 케이스는 롤백이 완료되었다고하더라도 테스트 데이터를 지속합니다.

+0

1. 수동 트랜잭션을 사용하지 않는 Spring 2. @Rollback 주석을 확인하십시오. – abalogh

답변

6

사용자의 경우 최대 절전 모드 트랜잭션을 수동으로 관리하므로 스프링 기반 트랜잭션 관리가 작동하지 않습니다.

다음을 수행해야 Spring 관리 트랜잭션을 사용하기 위해 : 또한

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

참조 :

+0

친애하는 신 - 그 해결책은 쉬웠다. 링크 주셔서 감사합니다! – chzbrgla