Тестирование модулей DAO

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

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

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

Как лучше всего использовать Unit Test только DAO с такими зависимостями?

Ответы

Ответ 1

Лично, я unit test DAO, попав в какую-либо тестовую базу данных, желательно, чтобы тот же тип базы данных (а не база данных SAME, очевидно), которую ваше приложение использует в процессе производства.

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

Как только DAO будут протестированы, определите их в unit test своих сервисах.

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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