我有一个像下面那样的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);
答案 0 :(得分:2)
问题似乎出现在ServletContext
模拟中。你可以通过Mockito.mock(ServletContext.class)
创建它,Mockito足够聪明,可以提供一个实现所有ServletContext
方法的对象,但是你怎么想它会知道要实现什么行为?
本身,它不能,不仅仅是接口类继续。 Mockito所能做的就是提供具有正确签名的存根。您没有做任何事情(在您提供的内容中),以便为模拟的setAttribute()
方法提供实际记录已设置的属性,或者为其getAttribute()
方法查找并返回该对象。看来,Mockito可以支持它,但你需要告诉它该怎么做。
另请注意,如果要验证contextInitialized()
方法是否设置了属性,那么检查的最佳方法是检测ServletContext
模拟,而不是通过观察侦听器的输出到{{ 1}}。依赖于输出也会将其带入测试范围,所以现在您要联合测试两个不同的功能。