Вы вызываете локальный метод при вызове persist()
из вашего тестового класса.Таким образом, прокси, который будет создавать транзакции, не вызывается, поэтому ваш вызов persist()
не имеет транзакции.
Чтобы сделать это правильно, нужно, чтобы тестовый класс не расширял объекттестируется, но вводится.Таким образом, будет запущен прокси-сервер и будет создана транзакция.
Кстати, я должен добавить, что нахожу дизайн вашего класса немного странным.Могу ли я предложить создать структуру, подобную следующей?
Интерфейс DAO:
public interface FooDao {
void persist(Foo foo);
// ...
}
Реализация DAO:
public class FooDaoImpl implements FooDao {
@PersistenceContext
private EntityManager entityManager;
@Transactional
public void persist(Foo foo) {
entityManager.persist(foo);
}
}
Класс тестирования:
@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration(...)
public class FooDaoTest {
@Autowired
private FooDao fooDao;
@Test
public void testPersist() {
// do some testing
}
}
Вы можете, если хотите, извлечь большую часть логики в реализациях DAO в общий суперкласс.