2012-07-16 2 views
2

Как я могу объединить методы тестирования, которые их намерение запрашивает в базе данных и возвращает некоторые данные? В других ситуациях я могу просто издеваться над объектами, но в этом случае я хочу проверить, вернули ли они правильные данные, как я должен проверить его изолированно от db? Должен ли я использовать какой-то специальный db? Но тогда как мне настроить этот новый db для работы, как и другой, со всеми этими столбцами и т. Д.?Методы тестирования, которые запрашивают базу данных с помощью JUnit

Спасибо.

Обновление: Спасибо всем, их ответы привели меня к правильному пути. Наконец я использовал debry. Я просто добавил для этого новый persistence.xml. Никаких других существенных изменений и, похоже, сейчас не работает.

+3

Что конкретно вы пытаетесь протестировать? Если вы выполняете интеграционный тест * с * базой данных, вы можете либо работать с реальной базой данных, либо использовать внутри памяти, либо в любом случае. В любом случае, да, если есть БД, вам нужны данные, которые подтверждают фактическая схема, по крайней мере, до тех пор, пока ваши тесты не будут действовать против нее. –

+0

Спасибо, например, если я хочу проверить debry. Внутри mothods класса, который я тестирую, я сохраняю (модель) команды. Итак, не меняя код класса, могу ли я просто настроить среду для использования debry вместо mysql? – Sara

ответ

1

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

+0

У меня огромный класс. Что работает следующим образом: у него есть несколько методов, например getAssets() внутри этого метода, он создает критерии Hibernate и затем основывается на том, что возвращает активы из таблицы Asset. Поэтому я хочу протестировать этот метод. Если я использую издевавшиеся объекты и расскажу, что вернуть, я фактически не тестировал функциональность этого класса. Есть я? – Sara

+0

Или, может быть, я не понял насмешек очень хорошо! – Sara

+1

В идеале, весь ваш доступ к внешним ресурсам обеспечивается с помощью тонких (минимальных логических) классов адаптеров. Вы издеваетесь над этими классами, чтобы выполнить тестирование устройства, увидев, правильно ли вызывается их методы. Адаптеры сами по себе глупы и не нуждаются в тщательном тестировании. Теперь, это не всегда хорошо работает на практике, если вы публикуете некоторые из кода, который вам нужен для модульного тестирования, возможно, мы могли бы помочь вам лучше. –

3

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

  1. Maven построить свой проект
  2. Liquibase (или пролетный путь), чтобы управлять схемой базы данных и управления версиями это
  3. H2, как база данных в памяти, которая запускается вместе с вашими тестами.

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

Maven должен запустить экземпляр базы данных H2 в памяти перед выполнением любых тестов. В приложении Spring вы можете просто указать свой источник данных с URL-адресом H2 JDBC, и он начнется автоматически.

Вы можете использовать Liquibase для запуска набора XML-скриптов для настройки схемы базы данных, а затем отдельный файл для заполнения их тестовыми данными (либо путем указания разных файлов при работе с Liquibase, либо с помощью атрибута context каждый changeSet). Это можно сделать с помощью Maven или весной с использованием конкретного компонента Liquibase.

Оттуда вы можете протестировать свое приложение точно так, как если бы оно было обычным приложением. Не нужно насмехаться, и в результате вы получаете гораздо более полезные тесты. Возможно, вам придется изменить свою схему или иным образом обойти SQL-различия между H2 и вашей собственной RDBMS.

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

1

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

Смежные вопросы