Модульное тестирование сервлета, зависящего от Spring WebApplicationContextUtils.getRequiredWebApplicationContext (context) - PullRequest
2 голосов
/ 11 декабря 2011

Я хотел бы провести модульное тестирование кода сервлета, который использует WebApplicationContextUtils.getRequiredWebApplicationContext(context) Spring в его методе init().

Вот часть кода:

@Override
public void init() throws ServletException {
super.init();
WebApplicationContext applicationContext =
    WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.injectedServiceBean = (SomeService) applicationContext.getBean("someBean");
}

Каков наилучший способ вставить правильный applicationContext.xml (тестовая версия) в этот текст?

Я знаю о @ContextConfiguration Spring, но я не уверен насчет лучшего подхода к внедрениюконтекст ${testClass}Test-context.xml, который загружается этой аннотацией в контекст сервлета, так что getRequiredWebApplicationContext (...) может вернуть его.

1 Ответ

9 голосов
/ 11 декабря 2011

Вы можете добавить контекст приложения следующим образом:

getServletContext().setAttribute(
  WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
  testApplicationContext
);

Это работает, потому что WebApplicationContextUtils выбирает объект, сохраненный в ServletContext, с ключом org.springframework.web.context.WebApplicationContext.ROOT (WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE константа).

Это только показывает, что получение бинов непосредственно из контекста приложения проблематично, поскольку этот подход не следует правилам DI. Если вы можете, попробуйте рефакторинг этого сервлета, чтобы лучше интегрировать его с Spring (например, используя HttpRequestHandlerServlet см. Пример ).

...