весенние, транзакционные и модульные тесты - как установить транзакцию на уровне класса - PullRequest
0 голосов
/ 15 марта 2011

Я использую Spring Junit Runner и его возможности транзакций для запуска и отката транзакций до и после каждого теста.

Однако у меня есть тестовый класс с некоторой интенсивной инициализацией БД, и я хочу каждый тест (метод) выполнить в рамках транзакции, то есть запустить транзакцию в начале теста и откатить ее после завершения всех тестов в классе.

1 Ответ

5 голосов
/ 15 марта 2011

Знаете ли вы, что наличие всех методов тестирования внутри вашего класса в одной транзакции вызовет много проблем?По сути, вы больше не можете зависеть от наличия чистой базы данных, так как другие методы тестирования будут изменять ее по пути.А поскольку порядок методов тестирования не указан, вы также не можете зависеть от него (поэтому вы никогда не узнаете, что именно хранится в базе данных).По сути, вы отказываетесь от поддержки всех тестовых транзакций, ваша единственная гарантия состоит в том, что после выполнения всего тестового примера база данных останется чистой (поэтому другие тестовые случаи не будут затронуты).

Конец ворчания.Я не думаю, что Spring поддерживает такое поведение "из коробки" (частично по причинам, указанным выше).Однако, если вы внимательно посмотрите на TransactionalTestExecutionListener , он отвечает за поддержку транзакций в тестах на основе Spring.

@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
    //...
    startNewTransaction(testContext, txContext);
}

и:

@Override
public void afterTestMethod(TestContext testContext) throws Exception {
    //...
    endTransaction(testContext, txContext);
    //...
}

Теперь посмотрите дажеболее подробно, здесь не реализованы beforeTestClass и afterTestClass ... Подробные инструкции о том, как все это подключить, вы найдете в главе 9.3.5 справочной документации Spring.Подсказка: напишите свой собственный слушатель и используйте его вместо TransactionalTestExecutionListener.

...