У меня есть инфраструктура 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.
Наконец, почему мы должны изобретать что-то подобное? Разве это не довольно распространенная проблема? Разве нет решения, уже созданного кем-то там?