其實問題已經存在很久,自從使用了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;
}