edw*_*win 1 junit spring hibernate spring-annotations spring-transactions
我有一个带有junit4测试套件的Spring 3.1 MVC + Hibernate 3.6项目.我的问题是我的测试用例中没有开始交易,甚至认为我添加了@Transactional.
我的测试用例调用了一个控制器和一个dao.在控制器中,无论如何都要启动一个事务,所以它不会抱怨.在dao中,我添加了一个@Transactional(propagation = Propagation.MANDATORY)以确保它将进行测试的事务.目前它引发了一个IllegalTransactionStateException,我想这意味着没有当前的事务.
我试图创建programmaticaly一个事务,它确实工作,这意味着获取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;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试用例:
// ...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.
}
}
Run Code Online (Sandbox Code Playgroud)
我在所有Spring的文档中搜索并用我能想象的任何方式搜索它,但我不明白为什么交易没有开始.非常欢迎任何帮助.
axt*_*avt 13
使用时,@RunWith(SpringJUnit4ClassRunner.class)您应该从应用程序上下文中获取bean,SpringJUnit4ClassRunner而不是从您自己创建的bean中获取bean .
在您的情况下出现问题,因为@Transactional在单元测试中,在由管理的应用程序上下文中创建了一个事务SpringJUnit4ClassRunner,但是您调用从手动创建的应用程序上下文获取的bean上的方法.
因此,删除您的@BeforeClass方法并TaskDao通过自动装配获取:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/test-config.xml", "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class TestTaskController {
@Autowired
private TaskDao taskDao;
...
}
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
10203 次 |
| 最近记录: |