事件中设置的ServletContextListener属性为null

时间:2017-03-20 13:25:20

标签: java web.xml servletcontextlistener

我有一个像下面那样的ServletContextListener

public class MyServletContextListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
    System.out.println("Start");
    servletContextEvent.getServletContext().setAttribute("id1", "this is my value");
    System.out.println("Current value is" + servletContextEvent.getServletContext().getAttribute("id1"));
    System.out.println("End");
}

这将打印:

Start
Current value is null
End

是的,侦听器在web.xml中定义:

<listener>
    <listener-class>package.path.MyServletContextListener</listener-class>
</listener>

我错过了什么?

LE: 我在我的单元测试中获得了这个(使用junit和mockito)。在我的TestClass中,我有一个@BeforeClass方法,我在其中执行以下操作:

ServletRunner sr = new ServletRunner(new File("src/test/resources/WEB-INF/web.xml"));
ServletUnitClient sc = sr.newClient();

listener = new MyServletContextListener ();

    event = mock(ServletContextEvent.class);
    servletContext = mock(ServletContext.class);

    when(event.getServletContext()).thenReturn(servletContext);

    listener.contextInitialized(event);

1 个答案:

答案 0 :(得分:2)

问题似乎出现在ServletContext模拟中。你可以通过Mockito.mock(ServletContext.class)创建它,Mockito足够聪明,可以提供一个实现所有ServletContext方法的对象,但是你怎么想它会知道要实现什么行为

本身,它不能,不仅仅是接口类继续。 Mockito所能做的就是提供具有正确签名的存根。您没有做任何事情(在您提供的内容中),以便为模拟的setAttribute()方法提供实际记录已设置的属性,或者为其getAttribute()方法查找并返回该对象。看来,Mockito可以支持它,但你需要告诉它该怎么做。

另请注意,如果要验证contextInitialized()方法是否设置了属性,那么检查的最佳方法是检测ServletContext模拟,而不是通过观察侦听器的输出到{{ 1}}。依赖于输出也会将其带入测试范围,所以现在您要联合测试两个不同的功能。