2013-04-16 4 views
0

Я пытаюсь выполнить тестирование своих DAO, но у меня проблемы.Весенний спящий режим - модульное тестирование dao

Во-первых, мой DAO имеет 1 метод: a findById тип метод. Я хочу написать для этого единичный тест. так, моя линия мышления:

  • для того, чтобы проверить этот метод, я должен вставить Известное Entity
  • вызов findById() на DAO,
  • , а затем утверждать, что я получить обратно то, что я первоначально вставлен.

Теперь у меня с трудом получается выяснить, как сделать вставку.

Мои интересы:

  1. я в настоящее время не имеют insert метод в моей DAO. Я мог бы написать один, но я не вижу смысла делать это просто ради тестирования.

  2. Другая возможность заключается в использовании Hibernate API (т.е. HibernateTemplate) для выполнения вставки. Но я хочу, чтобы мои модульные тесты были гибкими. Я не хочу привязывать свои модульные тесты к любому конкретному API.

Что мне делать?

+0

Есть быстрый Google в Mockito - это система тестирования, которая позволяет вам имитировали результаты. Он не отвечает на ваш запрос полностью, но это определенно место для начала поиска. – david99world

ответ

2

В зависимости от вашей базы данных (я предпочитаю вариант с памятью для тестирования), вы должны иметь возможность предварительно заполнить базу данных и установить ее в известное состояние перед каждым отдельным тестом. Таким образом, нет необходимости в методе insert только для тестирования. Я использовал HSQLDB (который теперь перегружен другой базой данных, которую я не помню сейчас), и я обычно создаю базу данных и запускаю некоторые вставки SQL-операторов для заполнения базы данных перед каждым тестом. Для этого существуют рамки, например DbUnit.

Редактировать

В базе данных я думал был H2. Похоже, что он также имеет аккуратный особенность, что он может execute a script when a connection is made

String url = "jdbc:h2:mem;INIT=runscript from '~/create.sql'\\;runscript from '~/populate.sql'"; 
1

Вообще-то я не пишу юнит-тестов для моих DAO,. Я предпочитаю тестировать эту область с помощью интеграции/функционального тестирования.

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

Весна обеспечивает превосходную среду тестирования уровня DAO, где изменения данных откатываются назад, так что один тест не влияет на другие из-за изменения данных.

1

При настройке весеннего контекста теста интеграции вы можете использовать Spring's support for embedded databases. <jdbc:script> тег позволяет выполнять инициализации и уничтожить скрипты:

<jdbc:embedded-database type="H2" id="dataSource"> 
    <jdbc:script execution="INIT" location="setup.sql"/> 
    <jdbc:script execution="DESTROY" location="teardown.sql"/> 
</jdbc:embedded-database> 
+0

спасибо, я использовал встроенную базу данных и, похоже, работает очень хорошо. хотя, у меня проблемы при запуске. Я работаю с hibernate, поэтому моя схема db находится в моих файлах сопоставления, что означает, что мне не нужно писать кучу операторов CREATE TABLE. Но, если я запустил свой модульный тест, я получу исключение, поскольку таблица XXX не существует. что, кажется, происходит, это запустить мои инструкции insert перед созданием схемы. Как это исправить? еще раз спасибо! – user2285410

+0

Я думаю, что каждое решение для этой проблемы будет иметь некоторую цену. В этом случае цена заключается в том, что вам нужно поддерживать скрипт создания схемы, но это не так уж плохо: 1) Hibernate в основном выводит скрипт при использовании 'hibernate.hbm2ddl.auto = create-drop' с' hibernate.show_sql = true' ; 2) Я думаю, вы можете иметь несколько тегов init '