如何测试使用RequestDispatcher转发的无返回值(void)方法?
测试使用RequestDispatcher转发的Void方法
嗨,我来帮你搞定这个测试问题!因为你的方法是void类型,没有返回值,所以咱们测试的核心不是拿返回值断言,而是验证方法执行后触发的外部交互——也就是它是否正确调用了RequestDispatcher.forward()完成转发。你的现有代码还差几个关键步骤,我给你梳理清楚:
核心思路
对于无返回值的方法,我们要测试的是它的「副作用」:当session里的user为null时,是否真的请求转发到了/User/login.jsp。我们需要用Mock框架(你用的是EasyMock对吧?)来模拟Servlet API的对象,然后验证这些对象的方法是否按预期被调用。
完整的EasyMock测试代码
public void testAuthAction_userNull() { // 1. 创建所有需要的Mock对象,包括RequestDispatcher(你之前漏了这个) HttpServletRequest requestMock = createMock(HttpServletRequest.class); HttpServletResponse responseMock = createMock(HttpServletResponse.class); RequestDispatcher rdMock = createMock(RequestDispatcher.class); HttpSession sessionMock = createMock(HttpSession.class); // 2. 设定预期行为:先拿到session,再取user时返回null expect(requestMock.getSession()).andReturn(sessionMock); expect(sessionMock.getAttribute("user")).andReturn(null); // 3. 预期当请求转发路径是"/User/login.jsp"时,返回我们的Mock Dispatcher expect(requestMock.getRequestDispatcher("/User/login.jsp")).andReturn(rdMock); // 4. 标记我们预期Dispatcher的forward方法会被调用(void方法要用expectLastCall()) rdMock.forward(requestMock, responseMock); expectLastCall(); // 5. 把所有Mock切换到回放模式 replay(requestMock, sessionMock, rdMock, responseMock); // 6. 执行你要测试的那个void方法!(这里假设你的方法叫doAuth,记得换成你实际的方法名) AuthAction action = new AuthAction(); action.doAuth(requestMock, responseMock); // 7. 验证所有预期的交互都发生了 verify(requestMock, sessionMock, rdMock, responseMock); }
关键细节解释
- 为什么要Mock RequestDispatcher?:因为你的业务方法会调用它的
forward方法,我们需要确认这个方法确实被调用了,所以必须模拟它。 - void方法的预期怎么写?:EasyMock里对于无返回值的方法,调用完方法后要加
expectLastCall(),告诉框架我们预期这个方法会被执行。 - 一定要触发待测试方法:你之前的代码只是实例化了
AuthAction,但没调用要测试的方法,这等于没测!必须调用那个处理请求的void方法。
如果你用Mockito的话(更简洁)
很多人现在更常用Mockito,给你个参考版本:
@Test public void testAuthAction_userNull() { // 创建Mock对象 HttpServletRequest request = Mockito.mock(HttpServletRequest.class); HttpServletResponse response = Mockito.mock(HttpServletResponse.class); RequestDispatcher rd = Mockito.mock(RequestDispatcher.class); HttpSession session = Mockito.mock(HttpSession.class); // 设定Mock行为 Mockito.when(request.getSession()).thenReturn(session); Mockito.when(session.getAttribute("user")).thenReturn(null); Mockito.when(request.getRequestDispatcher("/User/login.jsp")).thenReturn(rd); // 执行待测试方法 AuthAction action = new AuthAction(); action.doAuth(request, response); // 直接验证forward方法被调用过 Mockito.verify(rd).forward(request, response); }
额外提示
- 确保你的业务方法逻辑是:当
user为null时,确实会调用request.getRequestDispatcher("/User/login.jsp").forward(request, response),测试就是用来验证这个逻辑是否正确。 - 如果你的方法里有异常处理(比如forward抛出IO异常),也可以加对应的测试场景。
内容的提问来源于stack exchange,提问作者Alessandro Macanha
相关产品推荐
相关产品推荐

