代码之家  ›  专栏  ›  技术社区  ›  black sensei

测试休眠父/子关系

  •  2
  • black sensei  · 技术社区  · 16 年前

    我使用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 回复  |  直到 16 年前
        1
  •  0
  •   Martin Blech    16 年前

    你可以这样做:

    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()
    }
    

    这样,至少你没有混合道子。

        2
  •  0
  •   ChssPly76    16 年前

    首先,你应该在打电话后关闭会议 tx.commit() .

    如果 MysessionImplementation.getSession() 返回活动会话(类似于 SessionFactory.getCurrentSession() )那么您的测试甚至不会像 session1 会和 session 两个孩子仍然会被束缚。

    如果 mysession实现.getsession()) 每次泄漏资源时都返回一个新会话。

    其次,在您的例子中,孩子是真孩子吗(他们的生命周期是否与父母有关)?如果是这样的话,你不应该 ChildDAO 一点也不(也许你没有),你可能有也可能没有 getChildInstance(id) 方法(不管它叫什么)在您的parentdao中。调用这种方法(或者,如果没有,使用 session.load() ParentDAOTest 因为你在测试 ParentDao 的功能。

    最后,请记住,仅仅测试插入的孩子是不够的。您还需要测试是否插入了正确的父/子关系(如果您的父子关系是双向的,您可以通过 child.getParent() 方法或在您的案例中调用的任何方法)。如果DAO支持,您还应该测试子删除。