Модульное тестирование DAO - PullRequest
20 голосов
/ 21 марта 2012

Я искал EasyMock и учебные пособия / примеры, посвященные его использованию для классов DAO модульного тестирования, для теста "вне контейнера". Тем не менее, я думаю, что большинство из них говорят о тестировании сервисного уровня вместо этого, насмехаясь над классом DAO. Я немного сбит с толку, это правда, как вы тестируете модуль DAO?

Кто-то скажет, что тесты, взаимодействующие с DB и EJB, на самом деле являются интеграционными тестами, а не модульными тестами, но тогда как вы узнаете, верен ли ваш SQL-код (при условии отсутствия ORM) и ваш DAO вставляет / запрашивает нужные данные из ваших реальных (читай, локальная база данных, которая похожа на базу данных)?

Я читал, что DBUnit - это решение для такой ситуации. Но мой вопрос об использовании фреймворка типа DBUnit «вне контейнера». Что, если DAO зависит от некоторых EJB-компонентов, как мы обрабатываем транзакции, что произойдет, если в ваших вставках есть триггеры, которые обновляют другие таблицы?

Каков наилучший способ для модульного тестирования только DAO с такими зависимостями?

Ответы [ 5 ]

28 голосов
/ 21 марта 2012

Лично я тестирую DAO, выполняя какие-то тестовые базы данных, предпочтительнее тот же тип баз данных (очевидно, не ЖЕ БД), который ваше приложение использует в работе.

Я думаю, что если вы это сделаете, то это скорее интеграционный тест, поскольку он зависит от работающей базы данных.Этот подход имеет то преимущество, что он максимально приближен к вашей рабочей среде.У него есть свои недостатки: вам нужна конфигурация теста, вам нужна работающая тестовая база данных (локальная для вашей машины или где-то в вашей среде), и тесты могут занять больше времени для запуска.Вы также должны быть уверены, что откатите тестовые данные после выполнения тестов.

После того, как DAO протестированы, определенно насмехайтесь над ними для модульного тестирования ваших служб.

15 голосов
/ 04 апреля 2012

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

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

В идеале, если у вас есть такой инструмент, как Hibernate, который абстрагирует базу данных, вы можете обойтись при использовании базы данных в памяти, такой как H2 или HSQLDB, чтобы ваши тесты работали быстрее и не было базы данных для создания. Если вам действительно нужно использовать реальную базу данных, убедитесь, что ваши тесты имеют ее для себя, чтобы они могли создавать и удалять данные, не затрагивая и не влияя на другие процессы. На практике маловероятно иметь базу данных для себя, как локально, так и в среде CI, а использование базы данных в памяти гораздо более практично.

3 голосов
/ 17 января 2013

В дополнение к ответам Koya вы можете использовать HSQLDB для тестирования DAO. Я полагаю, что вы использовали Spring и Hibernate в вашем проекте. Вам понадобятся отдельные файлы конфигурации для указания на HSQLDB, вам нужно будет вставить данные перед выполнением тестов. Существуют некоторые ограничения на то, что вы можете делать с HSQLDB, но это нормально для общего использования в качестве запросов и объединений. С этим решением можно использовать в непрерывной среде, например, Дженкинс. Интеграционные тесты могут использовать HSQLDB, поэтому эта часть не проверяется.

2 голосов
/ 04 апреля 2012

Я использую HSQLDB для тестирования Dao и Service API. Производительность хорошая и поддерживает транзакции. Я не использую EJB. Я использую Hibernate.

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

С уважением, Коя

1 голос
/ 14 мая 2012

Я в конечном итоге остановился на написании модульных тестов, которые могут выполняться вне контейнера, с живой базой данных и для поддержки транзакций, использующих автономный менеджер транзакций (Bitronix), я также могу выполнить откат.Я думаю, что это не делает тесты Pure Unit все еще ... Хотелось бы услышать ваше мнение об этом подходе.

...