Один интересный подход к этому вопросу - Тестовые контейнеры
Поскольку Postgres не имеет встроенного режима, но вы можете использовать вышеупомянутую инфраструктуру для запуска док-контейнера перед тестом, создать схему и применить миграции, если вы используете что-то вроде Flyway или Liquibase или интегрируете свое собственное решение .
Идея состоит в том, что контейнер будет подготовлен и доступен для теста при его запуске.
После прохождения теста (независимо от фактического результата, успеха или неудачи) вы можете остановить контейнер.
Запуск контейнера может быть довольно дорогим (считанные секунды), однако вы можете воспользоваться конфигурациями пружинного кэширования во время тестов, поэтому, когда начинается первый тест в модуле, контейнер фактически запускается, однако используется повторно между тестами и тестовыми случаями, поскольку контекст приложения не запускается заново.
Поддержание чистоты базы данных между тестами также становится тривиальной задачей из-за аннотации Spring @Transactional
, которую вы помещаете в тестовый случай, так что Spring искусственно откатывает транзакцию после каждого теста. Поскольку в Postgres даже команды DDL могут быть транзакционными, этого должно быть достаточно.
Единственное ограничение этого подхода заключается в том, что у вас должен быть доступный докер на сборочной машине или локальной машине разработки, если вы планируете запускать эти тесты локально (в Linux и Mac OS это не проблема, в любом случае, но в Windows вы для установки среды докера требуется по крайней мере Windows 10 Professional Edition).
Я использовал этот подход в реальных проектах и нашел его очень эффективным для интеграционного тестирования.