тестирование спящего родителя / ребенка - PullRequest
2 голосов
/ 05 августа 2009

Я использую Spring и Hibernate для моего уровня доступа к данным. Я хотел бы получить некоторые рекомендации о том, как построить мой модульное тестирование, чтобы проверить, эффективно ли вставлен hibernate в дочернюю таблицу (у родительского отображения hibernate есть все каскадное множество). Насколько я знаю, я не должен смешивать модульное тестирование Дао. Предположим, я тестирую методы родительского 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 голосов
/ 05 августа 2009

Прежде всего, вам обязательно нужно закрыть сеанс после того, как вы позвонили tx.commit().

Если MysessionImplementation.getSession() возвращает активный сеанс (аналогично SessionFactory.getCurrentSession()), тогда ваш тест даже не попадет в базу данных, поскольку session1 будет таким же, как session, и оба потомка все равно будут связаны с ним.

Если MysessionImplementation.getSession() каждый раз возвращает новый сеанс, вы теряете ресурсы.

Во-вторых, являются ли дети в вашем примере ИСТИННЫМИ детьми (связан ли их жизненный цикл с родителем)? Если это так, у вас вообще не должно быть ChildDAO (а может и нет), и вы можете иметь или не иметь метод getChildInstance(id) (как бы он ни назывался) в вашем ParentDAO. Вполне нормально вызывать такой метод (или, если у вас его нет, использовать session.load()) в ParentDAOTest, потому что вы тестируете функциональность ParentDao.

Наконец, имейте в виду, что просто проверить, что детей вставили, недостаточно. Вам также нужно проверить, что они были вставлены с правильным родителем (если ваши отношения родитель-ребенок двунаправлены, вы можете сделать это с помощью метода child.getParent() или как там это называется в вашем случае). Вам также следует проверить удаление потомков, если это поддерживается вашим дао.

0 голосов
/ 05 августа 2009

Вместо этого вы можете сделать:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...