Имитация запуска HTTP-запроса для действия Struts

Я пытаюсь преобразовать в JSF и Spring веб-приложение, написанное с использованием Struts и OpenSymphony (который на данный момент является мертвым проектом).

Проблема этого веб-проекта заключается в том, что действия Struts были написаны с использованием большого количества кода, который непосредственно отправляется и получает данные для представления (в результате создается JSP). Много раз у них также есть свои действия Struts, расширяющие другие действия, поэтому очень трудно отследить, какую логику выполняет, когда я вызываю какое-то действие с какой-либо формой.

Поэтому, если я хочу получить эти данные в моем управляемом компоненте JSF, я вижу два варианта:

  1. В каждом случае выяснить, что именно происходит в этой иерархии действий, и воссоздать этот код в некоторой службе пользовательского интерфейса (не зависящей от инфраструктуры), а затем вызвать эту службу из моего управляемого компонента.

  2. В моей службе пользовательского интерфейса, чтобы каким-то образом смоделировать работу HTTP-запроса для этого действия, получить эти данные, а затем вызвать эту службу из моего управляемого компонента.

(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 ответ

Поскольку вы переходите на Spring, вам может показаться интересным следующий аспект Spring:

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

Здесь они предоставляют вам полностью смоделированные объекты HttpSession, HttpRequest и HttpResponse, так что вы можете не только выполнять модульное тестирование устаревших действий Struts, но и использовать их, чтобы помочь в больших усилиях по рефакторингу.

Другие вопросы по тегам