Как использовать сессию в юнит-тесте? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть метод службы Spring, который получает объект, сохраненный в сеансе (используя FacesContext), следующим образом:

(MyObject)((HttpServletRequest) FacesContext
                .getCurrentInstance().getExternalContext().getRequest())
                .getSession().getAttribute("myObject");

, и я хотел бы поместить этот объект в сеанс в модульном тесте, прежде чем вызывать метод.

, поэтому я попробовал решение в этом посте:

Бин области действия сеанса Spring Test с использованием Junit

и в моем методе тестирования я поместил объектв сеансе перед вызовом службы, но служба выдает исключение при попытке получить объект из сеанса, я думаю, это потому, что недоступен FaceContext, как вы думаете?

Я использую Весна , Junit , JSF2, пожалуйста, сообщите, спасибо.

Ответы [ 3 ]

2 голосов
/ 30 января 2014

С Spring 3.2 это очень просто

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@WebAppConfiguration
public class SessionTest {

    @Autowired
    MockHttpSession session;


    @Test
    public void sessionAttributeTest() throws Exception {

        MyObject myObject = session.getAttribute("myObject");
        ...

    }
}

Дополнительная информация: Запрашиваемые и сессионные компоненты

1 голос
/ 15 декабря 2011

Я предполагаю, что вы говорите о HttpSession.

Создайте фиктивный сеанс, скажите фиктивному сеансу, чтобы он всегда возвращал этот объект при вызове его метода getAttribute с именем, используемым тестируемым объектом, и передавайте этот фиктивный сеанс, а не реальный, объекту тестирования. 1003 *

В этом помогут такие API-интерфейсы, как Mockito или EasyMock.

РЕДАКТИРОВАТЬ: Предположим, что метод, который вы хотите проверить, выглядит следующим образом:

public String foo() {
    // some lines of code
    MyObject o = 
        (MyObject)((HttpServletRequest) FacesContext
             .getCurrentInstance().getExternalContext().getRequest())
             .getSession().getAttribute("myObject");
    // some more lines of code, using o.
}

Вы можете изменить его следующим образом:

public String foo() {
    // some lines of code
    MyObject o = getMyObjectFromSession();
    // some more lines of code, using o.
}

protected MyObject getMyObjectFromSession() {
    return (MyObject)((HttpServletRequest) FacesContext
             .getCurrentInstance().getExternalContext().getRequest())
             .getSession().getAttribute("myObject");
}

И затем вы могли бы использовать фальшивый фреймворк, чтобы сделать что-то вроде этого (псевдокод):

// mockFoobar is the object to test. We just mock its getMyObjectFromSession method
FooBar mockFoobar = mock(Foobar.class);
MyObject objectInSession = new MyObject();
when(mockFoobar.getMyObjectFromSession()).thenReturn(objectInSession);

String s = mockFoobar.foo();
assertEquals("expected result", s);
0 голосов
/ 15 декабря 2011

Добавьте spring-mock к вашему тестовому пути, который даст вам org.springframework.mock.web.MockHttpSession.Это довольно простая реализация, которую можно создать с new без контейнера Java EE.

JAR также содержит макеты для запросов, ответов и всего остального. MockRunner , который делает то же самое.

...