Имитация запуска HTTP-запроса для действия Struts
Я пытаюсь преобразовать в JSF и Spring веб-приложение, написанное с использованием Struts и OpenSymphony (который на данный момент является мертвым проектом).
Проблема этого веб-проекта заключается в том, что действия Struts были написаны с использованием большого количества кода, который непосредственно отправляется и получает данные для представления (в результате создается JSP). Много раз у них также есть свои действия Struts, расширяющие другие действия, поэтому очень трудно отследить, какую логику выполняет, когда я вызываю какое-то действие с какой-либо формой.
Поэтому, если я хочу получить эти данные в моем управляемом компоненте JSF, я вижу два варианта:
В каждом случае выяснить, что именно происходит в этой иерархии действий, и воссоздать этот код в некоторой службе пользовательского интерфейса (не зависящей от инфраструктуры), а затем вызвать эту службу из моего управляемого компонента.
В моей службе пользовательского интерфейса, чтобы каким-то образом смоделировать работу 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:
Здесь они предоставляют вам полностью смоделированные объекты HttpSession, HttpRequest и HttpResponse, так что вы можете не только выполнять модульное тестирование устаревших действий Struts, но и использовать их, чтобы помочь в больших усилиях по рефакторингу.