我正在尝试将使用Struts和OpenSymphony(现在是dead project)编写的Web应用程序转换为JSF和Spring。
该Web项目的问题在于,Struts操作是使用其中的大量代码直接编写的,并获取视图的数据(生成的JSP)。很多时候他们的Struts动作也会扩展其他动作,因此当我用某种形式调用某个动作时,很难跟踪正在执行的逻辑。
因此,如果我想在我的JSF托管bean中获取此数据,我会看到两个选项:
在每种情况下确切地指出在该操作层次结构中发生的事情,并在某些UI服务(独立于框架)中重新创建该代码,然后从我的托管bean调用该服务。
在我的UI服务中,以某种方式模拟HTTP请求对该操作的操作,获取该数据,然后从我的托管bean调用该服务。
(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做呢?
答案 0 :(得分:0)
由于您正在转换为Spring,因此您可能会发现以下Spring方面很有趣:
在这里,它们为您提供了完全模拟的HttpSession,HttpRequest和HttpResponse对象,这样您不仅可以对传统的Struts操作进行单元测试,还可以使用它们来帮助进行大量的重构工作。