2009-08-05 13 views
2

私のデータアクセス層にspringとhibernateを使用 hibernateが効果的に子テーブルに挿入されているかどうかをテストするためにユニットテストを構築する方法についてのガイダンスがあります(親Hibernateマッピングカスケードがすべてセットにある)。私はDAOのユニットtesting.So iが親DAOのメソッドをテストしてる想定混在させることはできません知っているものについては はsaveWithChild:hibernateの親子関係のテスト

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を混合されていません。あなたがtx.commit()呼ばれてきた後

+0

ありがとうございます。 –

0

まず第一に、あなたは間違いなく、セッションを閉じる必要があります。

MysessionImplementation.getSession()もしリターン(SessionFactory.getCurrentSession()に似て)アクティブなセッションは、あなたのテストでもsessionと同じになるsession1としてデータベースにヒットするつもりはないとの両方の子供たちはまだそれにバインドされます。

MysessionImplementation.getSession()は毎回新しいセッションを返す場合は、リソースをリークしています。

第二に、あなたの例TRUEの子供たち(彼らのライフサイクルは親にバインドされている)の子供たちは何ですか?その場合、ChildDAOを持ってはいけません(あなたがそうでないかもしれません)。あなたのParentDAOにgetChildInstance(id)メソッド(それが何であれ)があるかもしれません。 ParentDaoの機能をテストしているので、ParentDAOTestにそのようなメソッドを呼び出すことはまったく問題ありません(または、持っていなければsession.load()を使用してください)。

最後に、子供が挿入されたことをテストするだけでは不十分であることに注意してください。また、親と子の関係が双方向である場合は、child.getParent()メソッドを使用するか、あなたのケースで呼び出されたものであれば、正しい親を挿入したことをテストする必要があります。あなたのDAOによってサポートされている場合は、子の削除をテストする必要があります。

+0

非常に良いinsight.thanks答えです。 MysessionImplementationは毎回新しいセッションを返します。どのようにリソースのリークを防ぐには? –

+0

セッションを閉じます。 try/finallyを使用します。Session session = MysessionImplementation.getSession(); try {do stuff} finally {if(セッション!= null)session.close()}; – ChssPly76

+0

おかげでdude.reallyそれはまた、Hibernateの組み込みのセッション管理sessionFactory.getCurrentSession()を介して使用することを検討して –