测试hibernate父/子关系

时间:2009-08-05 15:39:24

标签: java unit-testing hibernate spring junit

我使用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.
}

我不知道,但我觉得这样做并不舒服。难道没有更好的方法吗? 你怎么检查这些东西?谢谢阅读。 ;)

2 个答案:

答案 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()),则您的测试甚至不会访问数据库,因为session1session相同孩子们仍然会受到约束。

如果MysessionImplementation.getSession()每次都返回一个新会话,那么您就会泄漏资源。

其次,您的示例中的孩子是真实的孩子(他们的生命周期是否与父母绑定)?如果是这种情况,你根本不应该有ChildDAO(也许你没有),你的ParentDAO可能有也可能没有getChildInstance(id)方法(无论它叫什么)。在session.load()中调用此类方法(或者,如果您没有,请使用ParentDAOTest),这是完全正确的,因为您正在测试ParentDao的功能。

最后,请记住,只是测试插入的孩子是不够的。您还需要测试它们是否与正确的父项一起插入(如果您的父子关系是双向的,您可以通过child.getParent()方法或在您的案例中调用它)。如果你的dao支持,你也应该测试子删除。