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