У меня нет проблем с тестированием моих DAO и служб, но когда я тестирую INSERT
или UPDATE
, я хочу отменить транзакцию и не повлиять на мою базу данных.
Я использую @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
, очевидно.
Почему игнорирование отката?