Hibernate Generic DAO - Проверка правильности сгенерированного SQL - PullRequest
0 голосов
/ 04 августа 2011

У меня есть инфраструктура DAO следующим образом:

StoreDao, CouponDao, PersonDao .

Все это происходит от GenericDao , который обладает основной функциональностью (с использованием Java Generics). вроде как объяснил здесь - [http://www.ibm.com/developerworks/java/library/j-genericdao/index.html][1]

Когда getAll () вызывается для StoreDao, фактически вызывается getAll () GenericDao, который добавляет определенное условие по умолчанию, например active = true, expires> now () к существующему HQL-запросу, который будет выполнен.

У нас есть куча тестов Dao, которые создают данные в их настройке (), есть куча тестов, которые утверждают ответ. Не совсем модульные тесты, поскольку база данных не проверяется, но я могу назвать интеграционные тесты.

Один из моих товарищей по команде создал инфраструктуру тестирования для проверки точности сгенерированных запросов sql. Он делает это следующим образом:

Имеет пользовательский перехватчик Hibernate, который перехватывает onPrepareStatement (), использует ASTParser Hibernate для создания XML-структуры запроса, который должен быть выполнен, а затем использует XPath для проверки запроса, например, посмотрите, присутствуют ли определенные поля в where оговорка, соединения правильные и т. д.

Мы делаем это, чтобы проверить Общий Дао в изоляции. Для этого нам нужно создать GenericDomain, GenericChildDomain, GenericDomain.hbm.xml вместе с таблицами, поддерживающими их.

Вопросы:

Стоит ли это того? Если мы не полностью смоделировали базу данных для всех наших модульных тестов, которые у нас уже есть, я не вижу причины для создания этой инфраструктуры.

Как мы можем не тестировать HQL с инфраструктурой, которая у нас уже есть. Если вы хотите убедиться, что active = true было добавлено к запросу, просто убедитесь, что DAO не возвращает данные с active = false.

И наконец, то, что мы делаем здесь, является специфичным для спящего режима, который в основном будет отброшен, если мы решим заменить наши DAO на скажем IBatis / JPA-EclipseLink / NoSQL.

Наконец, почему мы должны изобретать что-то подобное? Разве это не довольно распространенная проблема? Разве нет решения, уже созданного кем-то там?

1 Ответ

0 голосов
/ 04 августа 2011

При тестировании сгенерированного SQL мой голос звучит так: «Не делай этого». Если у вас нет особой потребности в том, чтобы запрос был сгенерирован особым образом - возможно, в очень чувствительной к производительности части приложения - в этом нет реальной необходимости. В основном, вы заинтересованы в тестировании на этом уровне, что вещи сохраняются и загружаются должным образом в соответствии с тем, как они отображаются, и что ваши методы поиска находят то, что должны. Похоже, вы склоняетесь к тому, чтобы просто запустить спящий режим и использовать свои DAO для реальной базы данных, и я бы сказал, что это правильный подход.

...