2009-08-05 176 views
2

我使用春季和休眠我的數據訪問層 我想有一些關於如何構建我的單元測試,以測試hibernate是否有效地插入到子表(父Hibernate映射在集合上都有級聯)。 什麼,我知道我不應該混道的單位testing.So假設在我測試的家長DAO方法saveWithChild:測試休眠父母/子女關係

public void testSaveWithChild() { 
    Child c1 = new Child("prop1", "prop2", prop3); 
    Child c2 = new Child("prop4", "prop4", prop3); 
    Parent p = new Parent("prop6","prop7"); 
    p.addChild(c1); 
    p.addChild(c2); 
    Session session = MysessionImplementation.getSession(); 
    Transaction tx = session.begingTransaction(); 
    ParentDAO.saveWithChild(p); 
    tx.commit(); 

    Session session1 = MysessionImplementation.getSession(); 
    //now it is right to call child table in here? 
    Child c1fromdb = (Child)session1.get(ChildClass.class,c1.getID()); 
    Child c2fromdb = (Child)session1.get(ChildClass.class,c2.getID()); 
    //parent asserts goes here 
    //children asserts goes here. 
} 

我不知道,但我不覺得舒適做this.Isn有沒有更好的辦法? 你將如何檢查這些東西?謝謝閱讀。 ;)

回答

0

你可以做,而不是:

public void testSaveWithChild() { 
    Child c1 = new Child("prop1", "prop2", prop3); 
    Child c2 = new Child("prop4", "prop4", prop3); 
    Parent p = new Parent("prop6","prop7"); 
    p.addChild(c1); 
    p.addChild(c2); 
    Session session = MysessionImplementation.getSession(); 
    Transaction tx = session.begingTransaction(); 
    ParentDAO.saveWithChild(p); 
    tx.commit(); 

    Session session1 = MysessionImplementation.getSession(); 
    Parent p2 = session1.get(ParentClass.class,p.getID()); 
    // children from db should be in p2.getChildren() 
} 

這樣一來,至少不要混用不同的DAO。

+0

謝謝你會嘗試 – 2009-08-05 17:16:51

0

首先,您應該在撥打tx.commit()後確定關閉會話。

如果MysessionImplementation.getSession()回報活動會話(類似於SessionFactory.getCurrentSession()),那麼您的測試甚至不打算打數據庫session1是一樣session和兩個孩子仍然會綁定到它。

如果MysessionImplementation.getSession()每次都會返回一個新的會話,那麼您正在泄漏資源。其次,是你的例子中的孩子TRUE孩子(是他們的生命週期綁定到父母)?如果是這種情況,你根本不應該有ChildDAO(也許你沒有),你的ParentDAO中可能有也可能沒有getChildInstance(id)方法(不管它叫什麼)。因爲您正在測試ParentDao的功能,所以在ParentDAOTest中調用此方法(或者,如果您沒有它,請使用session.load())是完全正確的。

最後,請記住,只是測試插入的孩子是不夠的。您還需要測試他們是否插入了正確的父母(如果您的父母與子女之間的關係是雙向的,您可以通過child.getParent()方法或您的案例中所稱的任何方法來完成)。如果你的dao支持,你也應該測試子刪除。

+0

非常好的洞察力。謝謝你的答案。 MysessionImplementation每次都會返回一個新的會話。那麼如何防止資源泄漏? – 2009-08-05 17:08:57

+0

關閉會話。使用try/finally:Session session = MysessionImplementation.getSession();嘗試{do stuff} finally {if(session!= null)session.close()}; – ChssPly76 2009-08-05 17:15:00

+0

感謝dude.really欣賞它 – 2009-08-05 17:18:43