Интеграционное тестирование в 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.


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


Комментарии

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

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

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

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