Nie mam problemu z testowaniem moich DAO i usług, ale kiedy testuję INSERT
s lub UPDATE
s, chcę wycofać transakcję i nie wpłynąć na moją bazę danych.Jak wycofać transakcję bazy danych podczas testowania usług ze Spring w JUnit?
Używam usług @Transactional
w ramach moich usług do zarządzania transakcjami. Chcę wiedzieć, czy możliwe jest sprawdzenie, czy transakcja będzie w porządku, ale czy można ją wycofać, aby zapobiec zmianie bazy danych?
To moja Test:
@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();
}
}
}
Problem polega na tym, że ten test nie powiedzie się, ponieważ transakcja została rollbacked, ale wkładka jest OK! Jeśli usuniemy @TransactionConfiguration(defaultRollback=true)
, wówczas testowanie zostanie zakończone, ale nowy rekord zostanie wstawiony do bazy danych.
@Test
@Transactional
@Rollback(true)
public void testInsert(){
long id = myService.addPerson("JUNIT");
assertNotNull(id);
if(id < 1){
fail();
}
}
Teraz można przetestować poprawnie, ale wycofanie jest ignorowane, a rekord jest wstawiany do bazy danych. Mam oczywiście metodę opisaną addPerson()
wewnątrz myService z @Transactional
. Dlaczego przywracanie jest ignorowane?
dobre pytanie +1 :-) –