2014-09-23 54 views
2

我有一個用@WebListener註解的類,擴展了ServletContextListener,我測試的另一個類依賴於執行。當我手動測試(即在Tomcat中運行)時,它可以工作,但在我的JUnit測試中,@WebListener類永遠不會執行。我假設我需要添加一些東西到我的配置來讓它執行,但我不知道是什麼。或者我需要在測試中手動運行它嗎?測試Spring WebListener

編輯: 下面是我加入到我的測試類的類

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

contextInitializedspringContext變量爲空。

回答

1

假設你正在使用MockMvc你的測試,你可以在Filter

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

我錯過了幾件事註冊。 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)); 
}