Когда я запускаю свои модульные тесты изолированно, они работают нормально, т.е. (опущены утверждения)
@Test
public void testSave()
{
EntityManagerHelper emh = new EntityManagerHelper();
LevelDAO dao = new LevelDAO();
Level l = new Level();
l.setName("aname");
emh.beginTransaction();
dao.save(l);
emh.commit();
}
затем выполнение этого индивидуального теста без проблем
@Test
public void testUpdate()
{
EntityManagerHelper emh = new EntityManagerHelper();
LevelDAO dao = new LevelDAO();
Level l = new Level();
l.setName("bname");
l.setLevelid(1);
emh.beginTransaction();
dao.update(l);
emh.commit();
}
Когда они выполняются одновременно в последовательности, я получаю эту ошибку - Транзакция в данный момент активна Есть ли способ разрешить запуск каждого модульного теста только после того, как транзакция из предыдущей части работы не активна? Должен ли я вместо этого смотреть на весну?
Обновление
EntityManagerHelper получает доступ к контексту персистентности следующим образом:
emf = Persistence.createEntityManagerFactory("bw_beta");
threadLocal = new ThreadLocal<EntityManager>();
что выглядит как проблема
Таким образом, хакерский обходной путь должен был использовать определение локально, т.е..
EntityManagerFactory factory = Persistence.createEntityManagerFactory("bw_beta");
EntityManager entityManager = factory.createEntityManager();
entityManager.getTransaction().begin();
dao.save(l);
entityManager.persist(l);
entityManager.getTransaction().commit();
Уверен, есть лучший способ - может быть, использовать Spring?