2011-06-14 26 views
5

Intento configurar un caso de prueba Junit para mi capa de dao. Sin embargo, hago NOT quiero que los datos de prueba se conserven realmente en la base de datos.@Transactional Prueba de Spring Junit que no realiza la reversión

Así que pensé que debería hacerlo de forma transaccional y deshacer después de cada prueba. Esto me deja con la configuración de la fuente de datos siguiente:

<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"/> 

La clase DAO-a-ser probado está configurado de la siguiente manera:

@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(); 
    } 
[...] 
} 

La persistencia real en el trabajo hace el trabajo muy bien. Sin embargo, la reversión prevista no se hace:

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

El TransactionalTextExecutionListener se define como sigue:

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

estoy usando un miembro de autowired acceder a mis métodos Dao

@Autowired 
private BallotBoxRepository repo; 

TL; DR

El caso de prueba JUnit es persistencia de los datos de prueba a pesar de que se indica que se ha realizado una reversión.

+0

1. no utilizan transacción manual manejo, use Spring 2. revise la anotación @Rollback. – abalogh

Respuesta

6

En su caso, la gestión de transacciones basada en Spring no funciona porque usted gestiona las transacciones de Hibernate manualmente.

Con el fin de utilizar las transacciones manejadas primavera que debe hacer lo siguiente:

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

Ver también:

+0

querido Dios, esa solución fue fácil. ¡Gracias por el enlace! – chzbrgla

Cuestiones relacionadas