天天看點

解決dao層單元測試問題

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

}

繼續閱讀