Интеграционное тестирование в Spring: TestContext Framework, объявление нескольких наборов @Sql

Если вам нужно настроить несколько наборов SQL сценариев для данного тестового класса или метода тестирования, но с другой конфигурацией синтаксиса, разными правилами обработки ошибок или разными фазами выполнения для каждого набора, вы можете объявить несколько экземпляров @Sql. В Java 8 вы можете использовать @Sql в качестве повторяемой аннотации. В противном случае вы можете использовать аннотацию @SqlGroup как явный контейнер для объявления нескольких экземпляров @Sql.

В следующем примере показано, как использовать @Sql в качестве повторяющейся аннотации с Java 8:

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

В сценарии, представленном в предыдущем примере, сценарий test-schema.sql использует другой синтаксис для однострочных комментариев.

Следующий пример идентичен предыдущему, за исключением того, что объявления @Sql сгруппированы вместе внутри @SqlGroup. В Java 8 и выше использование @SqlGroup необязательно, но вам может потребоваться использовать @SqlGroup для совместимости с другими языками JVM, такими как Kotlin.

Java

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

Kotlin

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

Этапы выполнения скрипта

По умолчанию SQL сценарии запускаются перед соответствующим методом тестирования. Однако, если вам нужно запустить определенный набор сценариев после метода тестирования (например, для очистки состояния базы данных), вы можете использовать атрибут executePhase в @Sql, как показано в следующем примере:

@Test
@Sql(
    scripts = "create-test-data.sql",
    config = @SqlConfig(transactionMode = ISOLATED)
)
@Sql(
    scripts = "delete-test-data.sql",
    config = @SqlConfig(transactionMode = ISOLATED),
    executionPhase = AFTER_TEST_METHOD
)
void userTest() {
    // запускаем код, 
    // который требует фиксации тестовых данных
    // в базе данных вне тестовой транзакции
}

Обратите внимание, что ISOLATED и AFTER_TEST_METHOD статически импортируются из Sql.TransactionMode и Sql.ExecutionPhase соответственно.


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


Комментарии

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

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

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

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