Я пишу интеграционные тестовые примеры для проекта, который использует Struts2, Spring, Hibernate, используя JUnit.StrutsSpringTestCase - Несколько контекстов - Как их правильно создать в порядке
Мой класс испытаний распространяется на StrutsSpringTestCase
. Приложению требуется логин/сеанс для вызова любых действий. Ниже приводится код:
@Test
public void testGetActionProxy() throws Exception {
ActionProxy proxy;
String result;
ActionContext.getContext().setSession(createUserSession()); // Not sure if this is needed here. But in order to get the session working, I need this.
proxy = initAction("cInfo");
assertNotNull(proxy);
CustInfo action = (CustInfo) proxy.getAction();
result = proxy.execute();
assertEquals(Action.SUCCESS, result);
}
initAction()
метод:
private ActionProxy initAction(String actionUri) {
ActionProxy proxy = getActionProxy(actionUri);
ActionContext.setContext(proxy.getInvocation().getInvocationContext()); // I tried this line of code to get the ServletActionContext.getMapping().getName() to work. But no use.
ActionContext actionContext = proxy.getInvocation().getInvocationContext();
actionContext.setSession(createUserSession()); // This is for setting a session
return proxy;
}
Прежде чем он попадает этот метод, он загружает все конфигурационные файлы. struts.xml
jpaContext.xml
, beans.xml
и т.д.
Мой Действие Класс CustInfo
реализует ServletRequestAware
и имеет метод getActionName
, который, как линия:
return ServletActionContext.getActionMapping().getName();
Это вызывается, когда я звоню result = proxy.execute();
. Таким образом, запрос не работает.
Вопрос 1: Почему он возвращает null
? Я думал, что ServletActionContext
автоматически инициируется, поэтому он должен вернуть значение. Но его нет. Если его не инициализировать, где это место для инициализации и как?
Я пробовал следующее после звонка getActionProxy
. Но это все еще не сработало.
ServletActionContext.setContext(proxy.getInvocation().getInvocationContext());
Вопрос 2: Для того, чтобы установить сеанс до getActionProxy()
, я имею позвонить,
ActionContext.getContext().setSession(createUserSession());
И снова, после того, как getActionProxy
ActionContext actionContext = proxy.getInvocation().getInvocationContext();
actionContext.setSession(createUserSession());
установить сеанс. Я предполагаю, что здесь что-то не так.
Вопрос 3: Похоже, есть несколько контекстов в игре здесь: applicationContext
, ActionContext
ServletContext
и ServletActionContext
.
Когда мой тестовый класс расширяет класс StrutsSpringTestCase
, я думаю, что applicationContext
инициализирован. Но я не уверен в других контекстах. Где их инициализировать?
Edit:
Дальнейшие исследования в исходном коде показывает один вопрос .. Когда я называю ServletActionContext.getActionMapping()
, внутренне его вызовом ActionContext
«ы get()
метода.
public Object get(String key) {
return context.get(key);
}
context
является карта объекта, в котором его ищет значение для ключа struts.actionMapping
, который не существует. Итак, возвращает null
. Но не знаю, почему он там. Это не пусто. Он имеет другие ключи/значения.
Хммм. Приложение проверяет значение в сеансе. Если это не произойдет, действие не будет выполнено. Поэтому я создаю сеанс и вставляю его вручную. При этом, похоже, он заботится о части «входа»/«сессии», но эта функция getActionMapping не работает. –
Вы должны указать конфигурацию для действия, то есть в 'struts.xml'. –