Тест интеграции Spring не выполняет откат

Я использую Spring + Hibernate + H2. Я выполняю операции с базой данных в своих интеграционных тестах (вызывая класс обслуживания). Я хочу, чтобы Spring откатывал изменения после каждого метода тестирования, но я не могу заставить его работать. Сначала я использовал MySQL (с MyISAM, который не поддерживает транзакции), но после перехода на H2 проблема осталась. Я пробовал несколько определений DataSource (после прочтения, что он должен быть осведомлен о XA), но ничего не помогает.

Я использую http://code.google.com / p / generic-dao / для моих классов DAO и аннотаций @ Transactional на моем уровне обслуживания (если я их удалю, я получаю следующую ошибку: javax.persistence.TransactionRequiredException: транзакция не выполняется).

Мои тестовые классы выглядят так:

@ContextConfiguration("classpath:...spring.xml")
@Transactional
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
public class DemoServiceTest extends AbstractTestNGSpringContextTests{
@Autowired
private DemoService demoService;

@Test
public void addTest()
{
    int size = demoService.findAll().size();
    Test coach = new Test();
    test.setName("Test");
    testService.save(test);
    Assert.assertEquals(size+1,testService.findAll().size());
}
}

Вот моя весенняя конфигурация:















    
    
    
    
    
    
            






    
    
    
    
        
    
    



    
    
    



    



    



    




И это моя реализация службы:

@Transactional
public class TestServiceImpl implements TestService {
    private TestDAO dao;

    @Autowired
    public void setDao(TestDAO dao) {
        this.dao = dao;
    }

    public void save(Test test) {
        dao.persist(test);
        dao.flush();
    }

    public List findAll() {
        return dao.findAll();
    }

    public Test findByName(String name) {
        if (name == null)
                return null;
        return dao.searchUnique(new Search().addFilterEqual("name", name));
    }
}

РЕДАКТИРОВАТЬ: Метод dao.persist () в основном инкапсулирует вызов следующего метода из genericdao (em возвращает текущий EntityManager):

/**
 * 

* Make a transient instance persistent and add it to the datastore. This * operation cascades to associated instances if the association is mapped * with cascade="persist". Throws an error if the entity already exists. * *

* Does not guarantee that the object will be assigned an identifier * immediately. With persist a datastore-generated id may not * be pulled until flush time. */ protected void _persist(Object... entities) { for (Object entity : entities) { if (entity != null) em().persist(entity); } }

Все работает нормально, но изменения остаются в базе данных. Есть идеи?

6
задан martin 19 July 2013 в 14:29
поделиться