我使用spring和hibernate作为我的数据访问层 我想有一些关于如何构建我的单元测试以测试hibernate是否有效插入子表的指导(父hibernate映射在集合中都有级联)。 据我所知,我不应该混合dao的单元测试。假设我正在测试父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.
}
我不知道,但我觉得这样做并不舒服。难道没有更好的方法吗? 你怎么检查这些东西?谢谢阅读。 ;)
答案 0 :(得分: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。
答案 1 :(得分:0)
首先,您应该在致电tx.commit()
之后关闭会话。
如果MysessionImplementation.getSession()
返回活动会话(类似于SessionFactory.getCurrentSession()
),则您的测试甚至不会访问数据库,因为session1
与session
相同孩子们仍然会受到约束。
如果MysessionImplementation.getSession()
每次都返回一个新会话,那么您就会泄漏资源。
其次,您的示例中的孩子是真实的孩子(他们的生命周期是否与父母绑定)?如果是这种情况,你根本不应该有ChildDAO
(也许你没有),你的ParentDAO可能有也可能没有getChildInstance(id)
方法(无论它叫什么)。在session.load()
中调用此类方法(或者,如果您没有,请使用ParentDAOTest
),这是完全正确的,因为您正在测试ParentDao
的功能。
最后,请记住,只是测试插入的孩子是不够的。您还需要测试它们是否与正确的父项一起插入(如果您的父子关系是双向的,您可以通过child.getParent()
方法或在您的案例中调用它)。如果你的dao支持,你也应该测试子删除。