2012-09-06 57 views
1


如何(使用了EasyMock & PowerMock)下面從DAO類的方法來創建JUnit測試方法,EasyMock的 - HibernateCallback.doInHibernate()方法調用

public List<MyVo> getSomeValue(final String systemId) { 
    //assume template set by @Resource(name = "hibernateTemplate") 
    HibernateCallback<List<MyVo>> callback = new HibernateCallback<List<MyVo>>() { 
     @Override 
     public List<MyVo> doInHibernate(Session session) { 
      Criteria criteria = session 
        .createCriteria(
          EntityClass.class, 
          "main"); 
      criteria.createAlias("AnotherName", 
        "ColName1"); 
      criteria.add(Restrictions.eq("pkId", 
        systemId)); 
      return template.findByCriteria(MyVo.class, criteria); 
     } 

    }; 
    return template.execute(callback); 
} 

我GOOGLE了它,但沒能得到任何解決方案。
請建議。
謝謝。
VAM

回答

2

在我看來,在這樣的單元測試中,試圖剔除HibernateTemplate是毫無意義的,因爲您的測試只會聲明您以特定順序調用某些方法 - 並且存在於您的DAO類的源代碼。這種類型的測試不會增加太多價值。

我認爲這是更好用真正HibernateTemplate迷上了在內存中的SQL數據庫來測試DAO,使用像DBUnit的,或只是一個外部SQL腳本來設置你想要的「前」狀態數據在數據庫中。然後,您可以斷言getSomeValue()返回給定數據庫中的數據的預期值。

這可能被認爲更是「集成測試」,但國際海事組織它更有價值,然後使用一個模擬HibernateTemplate只斷言調用以某種順序某些方法無用單元測試。

Spring有很好的JDBC testing support以及the TestContext Framework這使得它在您的測試中加載Spring上下文並將wire連接到測試類變得非常簡單。