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));
}