模拟在Struts操作上运行HTTP请求

时间:2013-04-03 09:41:18

标签: spring spring-mvc struts opensymphony

我正在尝试将使用Struts和OpenSymphony(现在是dead project)编写的Web应用程序转换为JSF和Spring。

该Web项目的问题在于,Struts操作是使用其中的大量代码直接编写的,并获取视图的数据(生成的JSP)。很多时候他们的Struts动作也会扩展其他动作,因此当我用某种形式调用某个动作时,很难跟踪正在执行的逻辑。

因此,如果我想在我的JSF托管bean中获取此数据,我会看到两个选项:

  1. 在每种情况下确切地指出在该操作层次结构中发生的事情,并在某些UI服务(独立于框架)中重新创建该代码,然后从我的托管bean调用该服务。

  2. 在我的UI服务中,以某种方式模拟HTTP请求对该操作的操作,获取该数据,然后从我的托管bean调用该服务。

  3. (1)是我现在不想做的很多工作,也许是将来。 (2)速度要快得多,但我不知道如何在Struts的情况下这样做。

    如果我尝试做类似的事情:

    SomeAction Action = new SomeAction();
    action.execute();
    

    这通常不起作用......因为有时SomeAction继承的动作会获得request并从中获取数据。因此,克服它的一种方法是:

    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    
    SomeAction Action = new SomeAction();
    
    action.setServletRequest(request);
    action.execute();
    

    这仍然不起作用,因为有时SomeAction继承的动作会创建一些稍后将由SomeAction使用的对象。

    有没有办法简单地模拟当前请求对特定Struts操作的提交,并完全按照Struts容器的方式进行操作,这样我就能获得该操作的所有预期结果?

    我想这样的事情可以在测试类中完成,我如何为Struts做呢?

1 个答案:

答案 0 :(得分:0)

由于您正在转换为Spring,因此您可能会发现以下Spring方面很有趣:

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mock/web/package-summary.html

在这里,它们为您提供了完全模拟的HttpSession,HttpRequest和HttpResponse对象,这样您不仅可以对传统的Struts操作进行单元测试,还可以使用它们来帮助进行大量的重构工作。