2013-09-03 3 views
1

классов Моих Struts2 Действия использовать следующий код, чтобы успешно доступ к сеансуНе удается получить сеанс для тестирования JUnit

ActionContext.getContext().getSession().clear(); 

Однако, когда я пытаюсь использовать JUnit, чтобы проверить мои классы действий я получаю исключение NullPointer ,
я просматривал некоторые замечания, размещенные другими на StackOverflow и использую следующий код:

HttpServletRequest request; 

HttpSession session; 

@Before 
public void setUp() throws Exception {   

    request = Mockito.mock(HttpServletRequest.class); 
    request.setAttribute("beanList", beanList); 
    request = Mockito.mock(HttpServletRequest.class); 
    Mockito.when(request.getSession()).thenReturn(session); 

    Map<String, Object> contextMap = new HashMap<String, Object>(); 
    contextMap.put(StrutsStatics.HTTP_REQUEST, request); 
    ActionContext.setContext(new ActionContext(contextMap)); 
} 

Тем не менее, по-прежнему выдает ошибку пустого указателя. Система может успешно найти контекст, но когда он пытается получить сеанс, он умирает от меня. Я также пытаюсь несколько разных способов достичь той же цели безрезультатно. Любая идея, что я делаю неправильно?

+0

Mockito отлично, но для этого случая он не нужен. Сессия - это просто карта. Подробнее см. Мой ответ ниже. Кроме того, ваш NPE, вероятно, связан с тем, что вы фактически не устанавливаете карту сеанса в своем ActionContext нигде. Вы добавляете только HttpServletRequest. –

ответ

2

Используйте инъекции зависимостей подхода и изменить свои действия для реализации SessionAware. Затем структура Struts2 будет вводить сеанс в ваше действие, например, в примере ниже. Наконец, вы можете протестировать, просто введя карту в свое действие.

public class MyAction extends ActionSupport implements SessionAware { 
    private Map<String, Object> session; 

    public String execute() { 
    // do actiony stuff 
    return SUCCESS; 
    } 

    public void setSession(Map<String, Object> session) { 
    this.session = session; 
    } 
} 

FYI, ServletConfigInterceptor ручки, выполняющие эту инъекцию и тот же вид инъекции доступен для доступа к другим объектам сервлетов, такие как HttpServletRequest или ServletContext.

+0

Это работало для меня. Я просто использовал SessionAware в сочетании с Struts2 MockHttpSession. Конечно, мой босс просто сказал мне, что теоретически мой класс Action не должен использовать класс действия в любом случае (: Итак, теперь я могу переписать свой класс Action без использования сеанса! Еще хорошо знать, как это сделать. Спасибо Стивен. – Mike

+0

@Mike Рад, что это помогло. –

3

Как насчет создания или издевательства над вашей сессией?

session = mock(HttpSession.class);

перед вызовом

Mockito.when(request.getSession()).thenReturn(session);

+0

Dooh! Несколько часов назад я начал использовать Mockito. , , Я посмотрю, будет ли это решение. – Mike

+0

Nope. Все еще выбрасывает исключение NullPointer. – Mike

+0

Я довольно новичок во всем этом сам, но если я правильно помню, вы также захотите использовать оператор 'when' в точке вашего теста, который ваш код фактически вызывает' getSession' не в вашем методе установки –

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