Spring-тест и ServletContextListener в web.xml

Я пытаюсь использовать Spring-Test(3.2.10) и интеграционные тесты с TestNG по этой ссылке.

Я создал RootTest.java

@WebAppConfiguration
@ContextConfiguration("file:src/test/resources/root-context2.xml")
public class ReferenceServiceTest extends AbstractTestNGSpringContextTests {
...

весенний контекст загружен успехом. Но мои глобальные переменные не были созданы, потому что web.xml игнорируется. В web.xml у меня есть свой собственный "слушатель-класс"(реализация ServletContextListener) и "context-param". Как я могу загрузить контекст web.xml (и вызывает всех слушателей запуска приложения) с помощью тестового контекста весенней интеграции?

1 ответ

Как указано в справочном руководстве, Spring MVC Test Framework...

"загружает фактическую конфигурацию Spring через платформу TestContext и всегда использует DispatcherServlet для обработки запросов, приближая тем самым полные интеграционные тесты, не требуя работающего контейнера сервлета".

Ключевым моментом здесь является "без... контейнера сервлетов". таким образом web.xml не входит в картину здесь. Другими словами, нет возможности для конфигурации в web.xml повлиять на интеграционные тесты с использованием Spring MVC Test Framework.

Теперь, сказав это, можно зарегистрировать сервлет Filter с MockMvc как это:

mockMvcBuilder.addFilters(myServletFilter);

или же

mockMvcBuilder.addFilters(myResourceFilter, "/resources/*");

И вы можете настроить context-param записи, добавив их вручную в ServletContext (что на самом деле весны MockServletContextПеред выполнением утверждений MockMvc как это:

wac.getServletContext().setInitParameter(name, value);

Но... нет способа настроить ServletContextListener используя Spring MVC Test. Если вы хотите, чтобы прослушиватель применялся ко всем вашим запросам, проходящим через Spring MVC, в качестве альтернативы вы можете рассмотреть возможность реализации пользовательского HandlerInterceptor или же WebRequestInterceptor (см. Настройка перехватчиков в справочном руководстве).

С Уважением,

Сэм

Попробуйте с MockServletContext

@Before
public void before() {
    MockServletContext mockServletContext = new MockServletContext();
    mockServletContext.setInitParameter("parameterName", "parameterValue");
    new MyListenerClass().contextInitialized(new ServletContextEvent(mockServletContext));
}
Другие вопросы по тегам