2009-08-05 5 views
2

내 데이터 액세스 계층에 스프링과 최대 절전 모드를 사용합니다. 최대 절전 모드가 자식 테이블에 효과적으로 삽입되는지 테스트하기 위해 단위 테스트를 구성하는 방법에 대한 지침이 필요합니다 (부모 절전 매핑 캐스케이드가 모두 세트에 있음). 내가 DAO의 단위 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를 혼합하지 않습니다. 당신이 tx.commit()라고 한 후 모든

+0

감사합니다. –

0

먼저, 당신은 확실히 세션을 닫아야합니다.

MysessionImplementation.getSession()하면 반환 (SessionFactory.getCurrentSession() 유사) 활성 세션은 테스트도 session 같은 것 session1로 데이터베이스에 접속하지 않을 두 아이들은 여전히 ​​바인딩 될 것이다. MysessionImplementation.getSession() 새로운 세션마다 반환하는 경우

, 당신은 자원을 누출하고 있습니다.

두 번째로, 귀하의 예가 TRUE 인 자녀 (부모에게 연결된 수명주기)입니까? 그렇다면 ChildDAO을 가지고 있으면 안되며 어쩌면 그렇지 않을 수도 있습니다. 부모님의 getChildInstance(id) 메쏘드가있을 수도 있고 없을 수도 있습니다. ParentDao의 기능을 테스트 중이므로 ParentDAOTest에서 그런 메소드를 호출하는 것은 완벽하게 (또는 가지고 있지 않다면 session.load()을 사용하십시오.) 유용합니다.

마지막으로, 어린이가 삽입되었는지 테스트하는 것만으로는 충분하지 않습니다. 또한 부모가 올바른 부모와 함께 삽입되었는지 테스트해야합니다 (부모 - 자식 관계가 양방향 인 경우 child.getParent() 메소드 또는 귀하의 케이스에서 호출 된 것). 또한 dao에서 지원하는 경우 삭제를 테스트해야합니다.

+0

매우 좋은 통찰력입니다. 답변에 대한 감사합니다. MysessionImplementation은 매번 새로운 세션을 반환합니다. 어떻게 자원 유출을 막는가? –

+0

세션을 닫습니다. try/finally를 사용하십시오. Session session = MysessionImplementation.getSession(); try {do stuff} finally {if (세션! = null) session.close()}; – ChssPly76

+0

감사 dude.really 또한, 최대 절전 모드에 내장 된 세션 관리 sessionFactory.getCurrentSession()를 통해 사용을 고려 –