Spring 3.1 MVC +Hibernate3.6プロジェクトとそのjunit4テストスーツがあります。私の問題は、@ Transactionalを追加したにもかかわらず、テストケースでトランザクションが開始されないことです。
私のテストケースはコントローラーとdaoを呼び出します。コントローラでは、とにかくトランザクションが開始されるので、文句はありません。daoでは、@ Transactional(propagation = Propagation.MANDATORY)を追加して、テストのトランザクションが確実に行われるようにしました。そして現在、IllegalTransactionStateExceptionが発生します。これは、現在のトランザクションがないことを意味していると思います。
プログラムでトランザクションを作成しようとしましたが、機能します。つまり、daoサービスを取得するためのAOPプロキシが問題の原因ではありません。ただし、 @ Transactionalアノテーションを使用してトランザクションを作成したいと思います。
これが私のダオです:
// ...imports...
@Repository("taskDao")
@Transactional(propagation = Propagation.MANDATORY)
public class TaskHome implements TaskDao {
private static final Log log = LogFactory.getLog(TaskHome.class);
private SessionFactory sessionFactory;
@Autowired
public TaskHome(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Task findById(int id) {
log.debug("getting Task instance with id: " + id);
try {
Task instance = (Task) this.sessionFactory.getCurrentSession().get(
Task.class, id); // exception raised here!
if (instance == null) {
log.debug("get successful, no instance found");
} else {
log.debug("get successful, instance found");
}
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
...
}
これが私のテストケースです:
// ...imports...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/test-config.xml", "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class TestTaskController {
private static ClassPathXmlApplicationContext context;
private static TaskDao taskDao;
@BeforeClass
public static void initHibernate() throws Exception {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
taskDao = context.getBean("taskDao", TaskDao.class);
}
@Test
public void testOnSubmit() {
// expects an existing default transaction here
Task task = taskDao.findById(1); // fails already here
// ... calls the controller and does some tests.
}
}
Springのすべてのドキュメントを検索し、想像できる方法でグーグルで検索しましたが、トランザクションが開始されない理由がわかりません。どんな助けでも大歓迎です。