У меня нет проблем с тестированием DAO и сервисов, но когда я тестирую INSERT
s или UPDATE
s, я хочу откатить транзакцию и не влиять на мою базу данных.
Я использую @Transactional
внутри моих служб для управления транзакциями.Я хочу знать, можно ли узнать, будет ли транзакция в порядке, но откатить ее, чтобы предотвратить изменение базы данных?
Это мой тест:
@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();
}
}
}
Проблема в том, что этотест не пройден, так как транзакция была отменена, но вставка в порядке!Если я удаляю @TransactionConfiguration(defaultRollback=true)
, то тестовый проход, но новая запись будет вставлена в базу данных.
@Test
@Transactional
@Rollback(true)
public void testInsert(){
long id = myService.addPerson( "JUNIT" );
assertNotNull(id);
if( id < 1 ){
fail();
}
}
Теперь можно выполнить тестовый проход правильно, но откат игнорируется и запись вставляется в базу данных.Я пометил метод addPerson()
внутри myService с помощью @Transactional
, очевидно.Почему откат игнорируется?