В чем разница между XmlWebApplicationContext, AnnotationConfigWebApplicationContext и GenericWebApplicationContext - PullRequest
1 голос
/ 06 июля 2019

Я пишу модульный тест с TestNG и spring-test, который загружает контексты xml на @ContextConfiguration и загружает сервлет диспетчера на @WebAppConfiguration. У меня есть класс, как удар, который получает контекст и печатает тип контекста.

@Component
public class ApplicationContextInitializer implements ApplicationContextAware {


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextInitializer.applicationContext = applicationContext;
        if (applicationContext instanceof AnnotationConfigApplicationContext) {
            System.out.println("1");
        }

        if (applicationContext instanceof GenericWebApplicationContext) {
            System.out.println("3");
        }

        if (applicationContext instanceof GenericXmlApplicationContext) {
            System.out.println("4");
        }

        if (applicationContext instanceof ResourceAdapterApplicationContext) {
            System.out.println("5");
        }

        if (applicationContext instanceof StaticApplicationContext) {
            System.out.println("6");
        }

        if (applicationContext instanceof XmlWebApplicationContext) {
            System.out.println("7");
        }

        if (applicationContext instanceof AnnotationConfigWebApplicationContext) {
            System.out.println("8");
        }
    }
}

Тестовый класс:

@ContextConfiguration(value = "classpath:integration-context-test.xml")
@TestPropertySource(locations = {"classpath:temp.properties"})
@WebAppConfiguration
public class TaskTest extends AbstractTransactionalTestNGSpringContextTests {}

Почему консоль печатает "3", показывая, что это GenericWebApplicationContext? Когда он вернет два других упомянутых типа? Можно ли получить XmlWebApplicationContext в письменном ApplicationContextInitializer классе при использовании TestNG?

1 Ответ

0 голосов
/ 07 июля 2019

Почему консоль печатает "3", показывая, что это GenericWebApplicationContext?

В интеграционном тесте с использованием Spring TestContext Framework значение ApplicationContext равно GenericWebApplicationContext, если вы аннотируете свой тестовый класс с помощью @WebAppConfiguration. В противном случае это будет GenericApplicationContext.

ApplicationContext для интеграционного теста загружается ContextLoader. В вашем примере конкретная реализация - это GenericXmlWebContextLoader. Это потому, что вы указываете locations для файла конфигурации XML.

Когда он вернет два других упомянутых типа?

В интеграционном тесте он не вернет другие упомянутые вами типы, поскольку все реализации ContextLoader в Spring TestContext Framework создают либо GenericApplicationContext, либо GenericWebApplicationContext.

Можно ли получить XmlWebApplicationContext в письменном ApplicationContextInitializer классе при использовании TestNG?

Нет, не в тесте.

Но обычно вам не нужно полагаться на то, что это XmlWebApplicationContext. Знание того, что это ConfigurableWebApplicationContext (и, следовательно, WebApplicationContext), обычно должно быть достаточным как в рабочем коде, так и в тестах.

...