Интеграционное тестирование в Spring: TestContext Framework, аннотация @Sql

Декларативное выполнение SQL сценариев с помощью @Sql

В дополнение к механизмам для программного запуска SQL сценариев вы можете декларативно настроить SQL сценарии в Spring TestContext Framework. В частности, вы можете объявить аннотацию @Sql в тестовом классе или тестовом методе, чтобы настроить отдельные операторы SQL или пути ресурсов к SQL сценариям, которые должны выполняться для данной базы данных до или после метода интеграционного тестирования. Поддержка @Sql обеспечивается SqlScriptsTestExecutionListener, который включен по умолчанию.

Объявления @Sql на уровне метода по умолчанию переопределяют объявления уровня класса. Однако, начиная с Spring Framework 5.2, это поведение можно настроить для каждого тестового класса или для каждого тестового метода через @SqlMergeMode.

Семантика ресурсов пути

Каждый путь интерпретируется как ресурс Spring. Простой путь (например, "schema.sql") рассматривается как ресурс пути к классам, относящийся к пакету, в котором определен тестовый класс. Путь, начинающийся с косой черты, рассматривается как ресурс абсолютного пути к классам (например, "/org/example/schema.sql"). Путь, который ссылается на URL-адрес (например, путь с префиксом classpath:, file:, http:) загружается с использованием указанного протокола ресурсов.

В следующем примере показано, как использовать @Sql на уровне класса и на уровне метода в тестовом классе интеграции на основе JUnit Jupiter:

@SpringJUnitConfig
@Sql("/test-schema.sql")
class DatabaseTests {

    @Test
    void emptySchemaTest() {
        // запускаем код, 
        // использующий тестовую схему без тестовых данных
    }

    @Test
    @Sql({"/test-schema.sql", "/test-user-data.sql"})
    void userTest() {
        // запускаем код, 
        // использующий тестовую схему и тестовые данные
    }
}

Обнаружение сценария по умолчанию

Если не указаны сценарии или операторы SQL, делается попытка определить сценарий по умолчанию, в зависимости от того, где объявлен @Sql. Если значение по умолчанию не может быть обнаружено, создается исключение IllegalStateException.

  • Объявление уровня класса: если аннотированный тестовый класс - com.example.MyTest, соответствующий сценарий по умолчанию - classpath:com/example/MyTest.sql.
  • Объявление на уровне метода: если аннотированный тестовый метод называется testMethod() и определен в классе com.example.MyTest, соответствующий сценарий по умолчанию - classpath:com/example/MyTest.testMethod.sql.

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


Комментарии

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

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

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

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