You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EasyMock设置属性时,Mock请求Session获取属性为空指针问题排查

问题原因分析

你遇到的问题其实是EasyMock(从createNiceMock方法能看出来用的是这个Mock框架)的使用误区:

你虽然创建了HttpSession的Mock实例,还调用了session.setAttribute("currentProject", project),但Mock对象的setAttribute方法并不会真正存储属性值——Mock对象的所有方法行为都需要你通过预期(expect)来定义,而不是像真实对象那样执行实际逻辑。

你只对req.getSession()做了预期,让它返回Mock的session,但完全没对session.getAttribute("currentProject")设置任何预期,所以当你调用这个方法时,NiceMock会返回对应类型的默认值(这里就是null),这就导致你的Project p为空。


修正后的Mock代码

你需要给session.getAttribute("currentProject")添加预期,让它返回你准备好的project对象,同时别忘了回放(replay)session对象(之前你只回放了req,没处理session):

// 创建Mock对象
HttpServletRequest req = createNiceMock(HttpServletRequest.class);
HttpSession session = createNiceMock(HttpSession.class);

// 定义session.getAttribute的预期行为,指定返回目标project
expect(session.getAttribute("currentProject")).andReturn(project);
// 定义req.getSession的预期行为
expect(req.getSession()).andReturn(session);

// 注意:两个Mock对象都需要调用replay来激活预期配置
replay(session);
replay(req);

额外补充说明
  • 如果你用的是EasyMock 3.x及以上版本,也可以用mock方法代替createNiceMock:普通mock会对未设置预期的方法抛出异常,而createNiceMock会返回默认值(null、0、false等),可以根据测试场景的严格程度选择。
  • 如果你需要验证setAttribute是否被正确调用,可以给这个void方法添加验证逻辑:
    session.setAttribute("currentProject", project);
    expectLastCall();
    
    不过在你的测试场景里,核心是让getAttribute返回正确值,所以这一步不是必须的。

内容的提问来源于stack exchange,提问作者tobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:59:09