Тестирование Hibernate DAO без создания вселенной вокруг него - PullRequest
6 голосов
/ 27 мая 2010

У нас есть приложение, созданное с использованием Spring / Hibernate / MySQL, теперь мы хотим протестировать слой DAO, но здесь есть несколько недостатков, с которыми мы сталкиваемся.

Рассмотрим вариант использования нескольких объектов, связанных друг с другом, например: Книга содержит страницы.

  • Объект Page не может существовать без Книги, поскольку book_id является обязательным FK в Page.
  • Для тестирования страницы мне нужно создать книгу.

Этим простым сценарием использования легко управлять, но если вы начнете строить Библиотеку, пока вы не создадите всю вселенную, окружающую Книгу и Страницу, вы не сможете ее протестировать!

Итак, чтобы проверить страницу;

  • Создать библиотеку
  • Создать раздел
  • Создать жанр
  • Создать автора
  • Создать книгу
  • Создать страницу
  • Сейчас тестируем страницу.

Есть ли простой способ обойти это "создание вселенной" и просто протестировать объект страницы в изоляции. Я также хочу иметь возможность тестировать HQL, связанные с Page. например:

SELECT new com.test.BookPage (book.id, page.name) FROM Book book, Page page.

Предполагается, что JUnit работает изолированно, поэтому мне нужно написать код для сборки всех вспомогательных объектов в тестовом примере для создания страницы. Любые советы о том, как ускорить процесс.

Редактировать: Spring следует философии отката транзакций после выполнения тестов, тем самым отменяя все изменения. Изменения схемы ожидаются по мере нашего дальнейшего развития, я хочу иметь возможность регулярно проверять ее с производственной базой данных (резервная копия!).

Ответы [ 2 ]

5 голосов
/ 27 мая 2010

Я только что закончил проект с этой точной конфигурацией. Мы добились большого успеха, используя автономную базу данных HSQLDB для модульных тестов, а затем отключив ссылочную целостность схемы для этих тестов.

Поскольку вы используете Spring, выполните следующие действия:

  1. Создать новый файл конфигурации контекста для тестирования. Установите hibernate для выполнения create-drop для схемы в этой конфигурации.
  2. Создайте свой тест junit. Унаследуйте от AbstractTransactionalJUnit4SpringContextTests, величайшего абстрактного класса в истории вселенной, и аннотируйте класс своим новым @ContextConfiguration. Также используйте аннотацию @TransactionConfiguration для запуска каждого теста в транзакции с автоматическим откатом.
  3. запустить команду "SET REFERENTIAL_INTEGRITY FALSE;" через унаследованное свойство simpleJdbcTemplate в вашем методе @Before.
  4. посвятите оставшуюся часть @Before вызовам simpleJdbcTemplate, которые устанавливают базу данных. Обратите внимание, что вам больше не нужно указывать каждый столбец, на который вы ссылаетесь, только то, что вы тестируете!
  5. Наконец, напишите свои юнит-тесты против ваших DAO.

Вот несколько ссылок, которые помогут вам двигаться в этом направлении:

Как обычно с этим материалом, правильно настроить конфигурацию - сложная часть. Но как только все это заработает, вы станете испытателем юнитов стиля!

3 голосов
/ 27 мая 2010

Расширения Unitils для junit или testng имеют очень хорошую поддержку для этого. Они позволяют вам определять наборы данных, настроенные для тестируемого класса, поэтому ему нужна только часть юниверса, которую видит ваш класс, а затем он инициализирует базу данных перед началом тестов.

Оформить заказ: текст ссылки

Мы используем его, и он просто отлично работает. Намного лучше, чем «MockRepositories», которые мы использовали ранее, которые не тестируют HQL, а также, что важно, поведение транзакций в спящем режиме.

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