Интеграционное тестирование в Spring: аннотации Spring Testing, @DirtiesContext

@DirtiesContext указывает, что базовый Spring ApplicationContext был загрязнен во время выполнения теста (то есть тест каким-то образом изменил или повредил его - например, изменив состояние одноэлементного bean-компонента) и должен быть закрыт. Когда контекст приложения помечен как грязный, он удаляется из кеша среды тестирования и закрывается. Как следствие, базовый контейнер Spring перестраивается для любого последующего теста, для которого требуется контекст с такими же метаданными конфигурации.

Вы можете использовать @DirtiesContext как аннотацию на уровне класса, так и как аннотацию на уровне метода в пределах одного класса или иерархии классов. В таких сценариях ApplicationContext помечается как грязный до или после любого такого аннотированного метода, а также до или после текущего тестового класса, в зависимости от настроенного метода methodMode и classMode.

Следующие примеры объясняют, когда контекст может быть загрязнен для различных сценариев конфигурации:

Перед текущим тестовым классом, когда он объявлен в классе с режимом класса, установленным на BEFORE_CLASS.

@DirtiesContext(classMode = BEFORE_CLASS) // Загрязнение контекста перед текущим тестовым классом.
class FreshContextTests {
    // некоторые тесты, требующие нового контейнера Spring
}

После текущего тестового класса, когда он объявлен в классе с режимом класса, установленным на AFTER_CLASS (т.е. режим класса по умолчанию).

@DirtiesContext // Загрязнение контекста после текущего тестового класса.
class ContextDirtyingTests {
    // некоторые тесты, 
    // которые приводят к загрязнению контейнера Spring
}

Перед каждым тестовым методом в текущем тестовом классе, если он объявлен в классе с режимом класса, установленным на BEFORE_EACH_TEST_METHOD.

@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) 
class FreshContextTests {
    // некоторые тесты, требующие нового контейнера Spring
}

После каждого тестового метода в текущем тестовом классе, если он объявлен в классе с режимом класса, установленным на AFTER_EACH_TEST_METHOD.

@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) 
class ContextDirtyingTests {
    // некоторые тесты, 
    // которые приводят к загрязнению контейнера Spring
}

Перед текущим тестом, когда он объявлен в методе с режимом метода, установленным на BEFORE_METHOD.

@DirtiesContext(methodMode = BEFORE_METHOD) 
@Test
void testProcessWhichRequiresFreshAppCtx() {
    // некоторая логика, требующая нового контейнера Spring
}

После текущего теста, когда он объявлен в методе с режимом метода, установленным на AFTER_METHOD (т.е. режим метода по умолчанию).

@DirtiesContext 
@Test
void testProcessWhichDirtiesAppCtx() {
    // некоторая логика, 
    // которая приводит к загрязнению контейнера Spring
}

Если вы используете @DirtiesContext в тесте, контекст которого настроен как часть иерархии контекста с помощью @ContextHierarchy, вы можете использовать флаг hierarchyMode для управления очисткой кеша контекста. По умолчанию для очистки кеша контекста используется исчерпывающий алгоритм, включая не только текущий уровень, но и все другие иерархии контекста, которые имеют общий контекст предка, общий для текущего теста. Все экземпляры ApplicationContext, которые находятся в подиерархии общего контекста предка, удаляются из кеша контекста и закрываются. Если исчерпывающий алгоритм является излишним для конкретного варианта использования, вы можете указать более простой алгоритм текущего уровня, как показано в следующем примере.

JavaKotlin
@ContextHierarchy({
    @ContextConfiguration("/parent-config.xml"),
    @ContextConfiguration("/child-config.xml")
})
class BaseTests {
    // тело класса...
}

class ExtendedTests extends BaseTests {

    @Test
    @DirtiesContext(hierarchyMode = CURRENT_LEVEL) // Использовать алгоритм текущего уровня.
    void test() {
        // некоторая логика, 
        // которая приводит к загрязнению дочернего контекста
    }
}


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


Комментарии

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

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

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

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