测试Spring WebListener

时间:2014-09-23 15:56:25

标签: java spring

我有一个用@WebListener注释的类,扩展了ServletContextListener,我测试的另一个类依赖于执行。当我手动测试(即在Tomcat中运行)时,它可以工作,但在我的JUnit测试中,@ 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));
}

springContext中的contextInitialized变量为空。

3 个答案:

答案 0 :(得分:2)

我错过了几件事。 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));
}

答案 1 :(得分:1)

假设您使用MockMvc进行测试,可以注册Filter

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

答案 2 :(得分:0)

我意识到这是一个老问题,但是我无意中找到了一个未在此处显示的答案。

我正在@WebListener

初始化的Spring Boot应用程序中使用嵌入式Apache FTP服务器。

在Junit测试期间,缺少Web侦听器类,并且无法进行FTP连接。

以下注释已修复

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

我希望这个答案可以帮助任何在此页面上迷路的人,以同样的方式帮助我。