Как я могу симулировать ошибки Hibernate во время автоматизированного модульного или системного теста? - PullRequest
1 голос
/ 12 ноября 2010

Я пытаюсь проверить мой код, написанный с использованием JBoss Seam и Hibernate. Чего бы я хотел достичь, так это:

Выполните автоматический тест SeamTest, чтобы запустить определенный метод для компонента Seam. Этот компонент выполняет обновление базы данных (объединение или сохранение). Я бы хотел, чтобы это обновление не сработало, что позволило мне протестировать код обработки ошибок и обеспечить корректное восстановление кода.

Я не смог определить простой способ сделать это.

Любые предложения будут оценены.

Ответы [ 3 ]

0 голосов
/ 12 ноября 2010

Я не использовал Seam, но я использовал DbUnit в проекте Hibernate.

DbUnit работает с JUnit и позволяет следующее:

  • загрузка данных в БД
  • выполнить тест JUnit (который может запрашивать БД)
  • удалить указанные данные из БД

Существуют другие варианты, основанные на конфигурации.

На этом фоне ваш тест может загрузить запись со значением в уникальном столбце.Затем тест пытается сохранить то же значение.Теперь у вас есть условие ошибки в повторяемом контролируемом тесте без изменения кода проекта.

0 голосов
/ 13 ноября 2010

Если обновление завершится неудачно из-за (смоделированной) неисправности в Hibernate или из-за того, что ваша проверка сущности не удалась? Я утверждаю, что вы вряд ли столкнетесь с первым делом. Я никогда не сталкивался с проблемами Hibernate, которые не были вызваны моим кодом. В таких ситуациях необходимо убедиться, что транзакция откатывается в случае возникновения исключения Hibernate. Обычно, если вы пометили свой метод действия в Seam с помощью @Transactional, ваша транзакция должна быть откатана до RuntimeException (каждый HibernateException равен RuntimeException).

Для последнего случая (тестирование проверки сущности) вы можете создать ComponentTest, который отправит недопустимую сущность в ваш метод обновления.

Другая ситуация, которую вы можете проверить, - это то, что происходит, если вы вызываете ваш метод с null сущностью для обновления или с сущностью, которой нет в БД.

Если вы опубликуете код вашего метода обновления, я постараюсь дать еще несколько советов.

0 голосов
/ 12 ноября 2010

Отказ от ответственности: я не использовал шов.

Если предположить, что один модульный тест является одной транзакцией, не будет ли достаточно исключения RuntimeException после обновления базы данных?

...