1

我正在尝试将使用 Struts 和 OpenSymphony 编写的 Web 应用程序转换为 JSF 和 Spring(现在这是一个死项目)。

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

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

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

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

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

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

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

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

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

SomeAction Action = new SomeAction();

action.setServletRequest(request);
action.execute();

这仍然不起作用,因为有时SomeAction继承自的 Actions 会创建一些稍后将由SomeAction.

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

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

4

1 回答 1

0

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

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

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

于 2013-04-03T11:20:01.787 回答