No tengo problemas para probar mi DAO y mis servicios, pero cuando pruebo INSERT
s o UPDATE
s, quiero deshacer la transacción y no afectar a mi base de datos.Cómo revertir una transacción de base de datos cuando se prueban servicios con Spring en JUnit?
Estoy usando @Transactional
dentro de mis servicios para administrar transacciones. Quiero saber si es posible saber si una transacción estará bien, pero si la revierte para evitar la alteración de 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 transacción se rollback, pero el inserto está bien! Si elimino @TransactionConfiguration(defaultRollback=true)
, pase la prueba 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 se puede probar la aprobación correctamente, pero se ignora la reversión y el registro se inserta en la base de datos. He anotado el método addPerson()
dentro de myService con @Transactional
, obviamente. ¿Por qué se ignora la reversión?
buena pregunta +1 :-) –