Интеграционное тестирование в Spring: TestContext Framework, программное управление транзакциями
Вы можете программно взаимодействовать с транзакциями управляемыми тестами, используя статические методы в TestTransaction. Например, вы можете использовать TestTransaction в тестовых методах, перед методами и после методов, чтобы начать или завершить текущую управляемую тестом транзакцию или настроить текущую управляемую тестом транзакцию для отката или фиксации. Поддержка TestTransaction автоматически доступна всякий раз, когда включен TransactionalTestExecutionListener.
В следующем примере демонстрируются некоторые возможности TestTransaction.
@ContextConfiguration(classes = TestConfig.class)
public class ProgrammaticTransactionManagementTests extends
AbstractTransactionalJUnit4SpringContextTests {
@Test
public void transactionalTest() {
// проверяем начальное состояние
// в тестовой базе данных:
assertNumUsers(2);
deleteFromTables("user");
// изменения в базе данных будут зафиксированы!
TestTransaction.flagForCommit();
TestTransaction.end();
assertFalse(TestTransaction.isActive());
assertNumUsers(0);
TestTransaction.start();
// выполняем другие действия с базой данных,
// которые будут автоматически
// откатываться после завершения теста ...
}
protected void assertNumUsers(int expected) {
assertEquals("Количество записей в [user] таблице.",
expected, countRowsInTable("user"));
}
}
Запуск кода вне транзакции
Иногда может потребоваться запустить определенный код до или после метода тестирования транзакции, но вне контекста транзакции - например, для проверки исходного состояния базы данных перед запуском теста или для проверки ожидаемого поведения фиксации транзакции после выполнения теста (если тест был настроен на фиксацию транзакции). TransactionalTestExecutionListener поддерживает аннотации @BeforeTransaction и @AfterTransaction именно для таких сценариев. Вы можете аннотировать любой void метод в тестовом классе или любой default void метод в тестовом интерфейсе с помощью одной из этих аннотаций, а TransactionalTestExecutionListener гарантирует, что ваш метод до транзакции или после метода транзакции выполняется в соответствующее время.
Любые методы до (например, методы, аннотированные с помощью @BeforeEach JUnit Jupiter) и любые методы после (например, методы, аннотированные с помощью @AfterEach JUnit Jupiter) выполняются в транзакции. Кроме того, методы, помеченные @BeforeTransaction или @AfterTransaction, не запускаются для методов тестирования, которые не настроены для работы в транзакции.
Настройка менеджера транзакций
TransactionalTestExecutionListener ожидает, что bean-компонент PlatformTransactionManager будет определен в Spring ApplicationContext для теста. Если в ApplicationContext теста есть несколько экземпляров PlatformTransactionManager, вы можете объявить квалификатор с помощью @Transactional("myTxMgr") или @Transactional(transactionManager = "myTxMgr"), или TransactionManagementConfigurer может быть реализован с помощью класса @Configuration.
Читайте также:
- Интеграционное тестирование в Spring: TestContext Framework, включение и отключение транзакций
- Интеграционное тестирование в Spring: TestContext Framework, тестирование бинов области действия запроса и сеанса
- Интеграционное тестирование в Spring: TestContext Framework, управление транзакциями
Комментарии
Отправить комментарий