Интеграционное тестирование в Spring: TestContext Framework, наследование конфигурации контекста

@ContextConfiguration поддерживает логические атрибуты inheritLocations и inheritInitializers, которые указывают, должны ли наследоваться местоположения ресурсов или классы компонентов и инициализаторы контекста, объявленные суперклассами. Значение по умолчанию для обоих флагов - true. Это означает, что тестовый класс наследует расположение ресурсов или классы компонентов, а также инициализаторы контекста, объявленные любыми суперклассами. В частности, местоположения ресурсов или классы компонентов для тестового класса добавляются к списку местоположений ресурсов или аннотированных классов, объявленных суперклассами. Точно так же инициализаторы для данного тестового класса добавляются к набору инициализаторов, определенных тестовыми суперклассами. Таким образом, подклассы имеют возможность расширять расположение ресурсов, классы компонентов или инициализаторы контекста.

Если для атрибута inheritLocations или inheritInitializers в @ContextConfiguration установлено значение false, местоположения ресурсов или классы компонентов и инициализаторы контекста, соответственно, для тестового класса затеняют и эффективно заменяют конфигурацию, определенную суперклассами.

В следующем примере, в котором используются местоположения ресурсов XML, ApplicationContext для ExtendedTest загружается из base-config.xml и extended-config.xml в указанном порядке. Бины, определенные в extended-config.xml, могут, следовательно, переопределять (то есть заменять) те, которые определены в base-config.xml. В следующем примере показано, как один класс может расширять другой и использовать как свой собственный файл конфигурации, так и файл конфигурации суперкласса:

@ExtendWith(SpringExtension.class)
// ApplicationContext будет загружен из "/base-config.xml"
// в корне пути к классам
@ContextConfiguration("/base-config.xml") 
class BaseTest {
    // тело класса...
}

// ApplicationContext будет загружен из "/base-config.xml" и
// "/extended-config.xml" в корне пути к классам
@ContextConfiguration("/extended-config.xml") 
class ExtendedTest extends BaseTest {
    // тело класса...
}

Точно так же в следующем примере, в котором используются классы компонентов, ApplicationContext для ExtendedTest загружается из классов BaseConfig и ExtendedConfig в указанном порядке. Бины, определенные в ExtendedConfig, могут, следовательно, переопределять (то есть заменять) те, которые определены в BaseConfig. В следующем примере показано, как один класс может расширять другой и использовать как свой собственный класс конфигурации, так и класс конфигурации суперкласса:

// ApplicationContext будет загружен из BaseConfig
@SpringJUnitConfig(BaseConfig.class) 
class BaseTest {
    // тело класса...
}

// ApplicationContext будет загружен 
// из BaseConfig и ExtendedConfig
@SpringJUnitConfig(ExtendedConfig.class) 
class ExtendedTest extends BaseTest {
    // тело класса...
}

В следующем примере, в котором используются инициализаторы контекста, ApplicationContext для ExtendedTest инициализируется с помощью BaseInitializer и ExtendedInitializer. Однако обратите внимание, что порядок, в котором вызываются инициализаторы, зависит от того, реализуют ли они интерфейс Spring Ordered или аннотируются аннотацией Spring @Order или стандартной аннотацией @Priority. В следующем примере показано, как один класс может расширять другой и использовать как собственный инициализатор, так и инициализатор суперкласса:

// ApplicationContext будет инициализирован BaseInitializer
@SpringJUnitConfig(initializers = BaseInitializer.class) 
class BaseTest {
    // тело класса...
}

// ApplicationContext будет инициализирован BaseInitializer
// и ExtendedInitializer
@SpringJUnitConfig(initializers = ExtendedInitializer.class) 
class ExtendedTest extends BaseTest {
    // тело класса...
}


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


Комментарии

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

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

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

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