其实问题已经存在很久,自从使用了Open Session In Test模式后,dao的单元测试就出现了奇怪行为——数据的修改操作不能提交事务,由此导致了一些"违反唯一约束条件"的错误。
由于当时只有一个测试报了错,我就偷懒把它屏蔽掉了。
由于最近老给同事们讲单元测试、要求他们严格测试,越发觉得心虚了,于是决定把欠下的账还上。
昨天下午一直鼓捣到8点多了,越改越乱,还是找不到原因,情绪很低落。
今天重新振作精神,一个小时就搞定了,哈哈哈哈
原来,事情是这样的:
protected void setUp() throws Exception {
log = LogFactory.getLog(WorkflowDriverDAOTest.class);
super.setUp();
dao = (WorkflowDriverDAO) ctx.getBean("workflowDriverDAO");
............
dao.saveWorkflowDriver(wd);
}
protected void tearDown() throws Exception {
try {
dao.removeWorkflowDriver(wd.getFlowDriverID());
}
catch (Throwable d) {
log.error(">>>>>" + d.getMessage());
}
super.tearDown();
dao = null;
}
黑体字那句话总是不能提交事务,结果就是插入的多个WorkflowDriver的WriteURL重复了,导致"违反唯一约束条件"错误。
可是更奇怪的是,并不是每个测试都错,而且报错位置总在一个查询方法调用处,我灵机一动:难道查询的操作会导致之前的那些更新操作提交?
一试验,果然如此,于是我在tearDown里面的删除操作后面加了一个查询的操作,问题就解决了。
protected void tearDown() throws Exception {
try {
dao.removeWorkflowDriver(wd.getFlowDriverID());
log.debug("Drivers num[" + dao.getAllWorkflowDrivers().size() + "]");
}
catch (Throwable d) {
log.error(">>>>>" + d.getMessage());
}
super.tearDown();
dao = null;
}