gpt4 book ai didi

java - 事件中设置的 ServletContextListener 属性为 null

转载 作者:行者123 更新时间:2023-12-02 02:57:08 26 4
gpt4 key购买 nike

我有一个像下面这样的 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);

最佳答案

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

仅靠接口(interface)类是不行的。 Mockito 所能做的就是提供带有正确签名的 stub 。您没有做任何事情(在您所展示的内容中)来为模拟的 setAttribute() 方法提供实际记录所设置的属性,或其 getAttribute() 方法查找并返回该对象。 Mockito 似乎可以支持这一点,但您需要告诉它做什么。

另请注意,如果重点是验证 contextInitialized() 方法是否设置了属性,那么最好的检查方法是检测 ServletContext 模拟,而不是通过观察监听器对 System.out 的输出。依赖输出也将其纳入测试范围,因此现在您正在联合测试两个不同的功能。

关于java - 事件中设置的 ServletContextListener 属性为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com