2014-10-31 3 views
-1

Я пишу интеграционные тестовые примеры для проекта, который использует 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.xmljpaContext.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, ActionContextServletContext и ServletActionContext.

Когда мой тестовый класс расширяет класс StrutsSpringTestCase, я думаю, что applicationContext инициализирован. Но я не уверен в других контекстах. Где их инициализировать?

Edit:

Дальнейшие исследования в исходном коде показывает один вопрос .. Когда я называю ServletActionContext.getActionMapping(), внутренне его вызовом ActionContext «ы get() метода.

public Object get(String key) { 
    return context.get(key); 
} 

context является карта объекта, в котором его ищет значение для ключа struts.actionMapping, который не существует. Итак, возвращает null. Но не знаю, почему он там. Это не пусто. Он имеет другие ключи/значения.

ответ

0

Ответ на вопросы:

ServletActionContext.getActionMapping() возвращает отображение из контекста действий, если он не установлен, то вы получите null.

Вы не должны устанавливать сеанс вручную, когда создается действие, сеанс создается.

Не путайте разные классы ActionContext, ServletContext и ServletActionContext. Вы не должны ничего делать с инициализацией этих объектов, потому что это делается суперклассом StrutsSpringTestCase.

public void testGetActionMapping() { 
    ActionMapping mapping = getActionMapping("/cInfo.action"); 
    assertNotNull(mapping); 
    assertEquals("/", mapping.getNamespace()); 
    assertEquals("cInfo", mapping.getName()); 
} 

public void testGetActionProxy() throws Exception {   
    ActionProxy proxy = getActionProxy("/cInfo.action"); 
    assertNotNull(proxy); 

    CustInfo action = (CustInfo) proxy.getAction(); 
    assertNotNull(action); 

    String result = proxy.execute(); 
    assertEquals(Action.SUCCESS, result); 
} 
+0

Хммм. Приложение проверяет значение в сеансе. Если это не произойдет, действие не будет выполнено. Поэтому я создаю сеанс и вставляю его вручную. При этом, похоже, он заботится о части «входа»/«сессии», но эта функция getActionMapping не работает. –

+0

Вы должны указать конфигурацию для действия, то есть в 'struts.xml'. –

Смежные вопросы