Интеграционное тестирование в Spring: TestContext Framework, выполнение SQL сценариев

При написании интеграционных тестов для реляционной базы данных часто бывает полезно запускать SQL сценарии для изменения схемы базы данных или вставки тестовых данных в таблицы. Модуль spring-jdbc обеспечивает поддержку для инициализации встроенной или существующей базы данных путем выполнения SQL сценариев при загрузке Spring ApplicationContext.

Хотя очень полезно инициализировать базу данных для тестирования один раз при загрузке ApplicationContext, иногда необходимо иметь возможность изменять базу данных во время интеграционных тестов.

Программное выполнение SQL сценариев

Spring предоставляет следующие параметры для программного выполнения SQL сценариев в рамках методов тестирования интеграции.

  • org.springframework.jdbc.datasource.init.ScriptUtils
  • org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
  • org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
  • org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests

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

ResourceDatabasePopulator предоставляет объектно-ориентированный API для программного заполнения, инициализации или очистки базы данных с помощью SQL сценариев, определенных во внешних ресурсах. ResourceDatabasePopulator предоставляет параметры для настройки кодировки символов, разделителя операторов, разделителей комментариев и флагов обработки ошибок, используемых при синтаксическом анализе и запуске скриптов. Каждый из вариантов конфигурации имеет разумное значение по умолчанию. Чтобы запустить сценарии, настроенные в ResourceDatabasePopulator, вы можете вызвать либо метод populate(Connection) для запуска populator для java.sql.Connection, либо метод execute(DataSource) для запуска populator для javax.sql.DataSource. В следующем примере указываются SQL сценарии для тестовой схемы и тестовых данных, устанавливается разделитель операторов на @@ и запускаются сценарии для DataSource:

@Test
void databaseTest() {
    ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    populator.addScripts(
            new ClassPathResource("test-schema.sql"),
            new ClassPathResource("test-data.sql"));
    populator.setSeparator("@@");
    populator.execute(this.dataSource);
    // запускаем код, использующий тестовую схему и данные
}

Обратите внимание, что ResourceDatabasePopulator внутренне делегирует ScriptUtils для анализа и запуска SQL сценариев. Точно так же методы executeSqlScript(..) в AbstractTransactionalJUnit4SpringContextTests и AbstractTransactionalTestNGSpringContextTests внутренне используют ResourceDatabasePopulator для выполнения SQL сценариев.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки