2014-09-23 3 views
2

У меня есть класс, аннотированный с помощью @WebListener, расширяющий ServletContextListener, который тестирует другой класс, который выполняется. Когда я тестирую вручную (т. Е. Работает в Tomcat), он работает, но в моем тесте JUnit класс @WebListener никогда не выполняется. Я предполагаю, что мне нужно добавить что-то в мою конфигурацию, чтобы заставить его выполнить, но я не уверен, что. Или мне нужно запустить его вручную в тесте?Тестирование Spring WebListener

EDIT: Вот основы класса

@WebListener 
public class MyListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
    // Retrieve spring application context 
    ServletContext servletContext = event.getServletContext(); 
    springContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); 
    ... 
    } 
    ... 
} 

я добавил в мой тестовый класс:

@Before 
public void mockInit() { 
    MockServletContext mockContext = new MockServletContext(); 
    new MyListener().contextInitialized(new ServletContextEvent(mockContext)); 
} 

Но springContext переменная в contextInitialized равна нулю.

ответ

1

Предполагая, что вы используете MockMvc для ваших тестов, вы можете зарегистрировать Filter с

MockMvcBuilders.webAppContextSetup(webAppContext).addFilter(yourFilter, urlPatterns); 
1

я пропускал пару вещей. Первый, мой тестовый класс не имел @WebAppConfiguration

@WebAppConfiguration 
public class ClassAbcTest extends TestBase { 
    ... 
} 

Во-вторых, мне нужно, чтобы установить корневой контекст приложения:

@Autowired 
private WebApplicationContext webAppContext; 

@Before 
public void mockInit() { 
    MockServletContext mockServletContext = new MockServletContext(); 
    mockServletContext.setAttribute(
    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webAppContext); 
    new MyListener().contextInitialized(new ServletContextEvent(
    mockServletContext)); 
} 
Смежные вопросы