Non ho problemi a testare il mio DAO ei servizi, ma quando provo INSERT
s o UPDATE
s voglio eseguire il rollback della transazione e non influire sul mio database.Come eseguire il rollback di una transazione di database durante il test dei servizi con Spring in JUnit?
Sto utilizzando il servizio @Transactional
all'interno dei miei servizi per gestire le transazioni. Voglio sapere, è possibile sapere se una transazione andrà bene, ma ripristinarla per evitare di alterare il database?
Questa è la mia prova:
@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();
}
}
}
Il problema è che questo test avrà esito positivo perché transazione è stata annullate da una rollback, ma l'inserto è OK! Se rimuovo @TransactionConfiguration(defaultRollback=true)
il test pass ma un nuovo record verrà inserito nel database.
@Test
@Transactional
@Rollback(true)
public void testInsert(){
long id = myService.addPerson("JUNIT");
assertNotNull(id);
if(id < 1){
fail();
}
}
Ora il test può passare correttamente, ma il rollback viene ignorato e il record viene inserito nel database. Ho annotato il metodo addPerson()
all'interno di myService con @Transactional
, ovviamente. Perché il rollback viene ignorato?
buona domanda +1 :-) –