【发布时间】:2017-08-11 19:14:58
【问题描述】:
我有一个像下面这样的 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>
我错过了什么?
乐: 我在我的单元测试中获得了这个(使用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);
【问题讨论】:
-
很好奇。我倾向于怀疑您提供的示例并不代表问题首次出现的真实代码 - 您没有使用相同的键来检索您用来设置它的值,或者也许您正在回读
null,因为这是您实际设置的值。您真的可以通过您提供的确切代码产生您描述的行为吗? -
是的,你是对的。这只是一个产生相同结果的示例代码。是的,为此类运行 junit 测试会产生上述输出。这就是为什么我认为我错过了一些东西。我正在使用相同的密钥来检索它,它是一个常量。
-
在单元测试期间观察到这种行为的事实改变了一切。在这种情况下,它与正在测试的内容高度相关——我想可能是你的听众的
contextInitialized()方法——以及如何设置测试夹具来模拟执行环境。您观察到的行为的出现完全有可能是因为测试夹具没有充分模拟 servlet 容器。例如,它的ServletContextEvent.getContext()实现可能会在每次调用时返回一个新对象。 -
查看更新的问题。
标签: java web.xml servletcontextlistener