Если вы действительно хотите писать тесты, которые взаимодействуют с базой данных - интеграционные тесты - тогда вам придется переводить базу данных в известное состояние перед каждым выполнением теста.
Один из способов сделать это - загружать пользовательский набор данных перед каждым тестом, например, используя DbUnit . Здесь каждый тест отвечает за свои собственные данные, очистка не требуется, и вы можете запросить базу данных после неудачного теста, чтобы понять проблему.
Другой способ - использовать «живую» базу данных, запускать тесты внутри транзакции и откатывать изменения в конце теста. Spring и Unitils поддерживают это. Это тоже хорошо работает, но не всегда легко диагностировать неудачный тест при использовании этого подхода.
Обратите внимание, что второй подход на самом деле не исключает первый, вы можете использовать собственный набор данных внутри транзакции. Также обратите внимание, что вы можете использовать базу данных, содержащую «справочные данные» (то есть данные только для чтения, такие как страны и т. Д.), И загружать только «динамические данные», чтобы ускорить процесс при использовании первого подхода.
Лично я не очень понимаю, что не так с предыдущим подходом (за исключением, может быть, тестов немного медленнее), такие инструменты, как DbUnit , делают это довольно легко. И, как я уже сказал, я считаю, что тесты, использующие DbUnit, легче диагностировать. Но более поздний подход определенно тоже работает.
В обоих случаях вам, конечно, следует использовать выделенную схему 1 .
1 На самом деле, использование одной схемы на разработчика определенно является лучшей практикой .