¿Cómo deshacer una transacción de base de datos al probar servicios con Spring en JUnit?
No tengo problemas para probar mi DAO y mis servicios, pero cuando lo prueboINSERT
s oUPDATE
s Quiero revertir la transacción y no afectar mi base de datos.
Estoy usando@Transactional
dentro de mis servicios para gestionar transacciones. Quiero saber, ¿es posible saber si una transacción estará bien, pero deshacerla para evitar alterar la base de datos?
Esta es mi prueba:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring.cfg.xml")
@TransactionConfiguration(defaultRollback=true)
public class MyServiceTest extends AbstractJUnit38SpringContextTests {
@Autowired
private MyService myService;
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Test
public void testInsert(){
long id = myService.addPerson( "JUNIT" );
assertNotNull( id );
if( id < 1 ){
fail();
}
}
}
El problema es que esta prueba fallará porque la transacción fue revertida, ¡pero la inserción está bien! Si quito@TransactionConfiguration(defaultRollback=true)
luego la prueba pasa pero se insertará un nuevo registro en la base de datos.
@Test
@Transactional
@Rollback(true)
public void testInsert(){
long id = myService.addPerson( "JUNIT" );
assertNotNull(id);
if( id < 1 ){
fail();
}
}
Ahora puede probar pasar correctamente, pero se ignora la reversión y el registro se inserta en la base de datos. He anotado el métodoaddPerson()
dentro de myService con@Transactional
obviamente ¿Por qué se ignora la reversión?