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

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


person Shamik    schedule 27.02.2011    source источник


Ответы (3)


Чтобы использовать области запроса и сеанса в модульном тесте, вам необходимо:

  • зарегистрируйте эти области в контексте приложения
  • создать фиктивный сеанс и запросить
  • зарегистрировать фиктивный запрос через RequestContextHolder

Примерно так (предположим, что вы используете Spring TestContext для запуска тестов): abstractSessionTest.xml:

<beans ...>
    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="session">
                    <bean class="org.springframework.web.context.request.SessionScope" />
                </entry>
                <entry key="request">
                    <bean class="org.springframework.web.context.request.RequestScope" />
                </entry>
            </map>
        </property>
    </bean>
</beans>

.

@ContextConfiguration("abstractSessionTest.xml")
public abstract class AbstractSessionTest {
    protected MockHttpSession session;
    protected MockHttpServletRequest request;

    protected void startSession() {
        session = new MockHttpSession();
    }

    protected void endSession() {
        session.clearAttributes();
        session = null;
    }

    protected void startRequest() {
        request = new MockHttpServletRequest();
        request.setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
    }

    protected void endRequest() {
        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).requestCompleted();
        RequestContextHolder.resetRequestAttributes();
        request = null;
    }
}

Теперь вы можете использовать эти методы в своем тестовом коде:

startSession();
startRequest();
// inside request
endRequest();
startRequest();
// inside another request of the same session
endRequest();
endSession();
person axtavt    schedule 28.02.2011
comment
Спасибо за подробное объяснение. Очень полезный. - person Shamik; 28.02.2011

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

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="session">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

При таком подходе вам не нужно имитировать какие-либо объекты запроса / сеанса.

Источник: http://tarunsapra.wordpress.com/2011/06/28/junit-spring-session-and-request-scope-beans/

person kctang    schedule 10.01.2012
comment
То же самое применимо к области 'request', просто используйте key = 'request' для bean-компонентов запроса. - person Zeus; 23.09.2016

Spring 3.2 и более поздние версии обеспечивают поддержку bean-компонентов с ограниченным сеансом / запросом для интеграционного тестирования

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@WebAppConfiguration
public class SampleTest {

    @Autowired WebApplicationContext wac;

    @Autowired MockHttpServletRequest request;

    @Autowired MockHttpSession session;    

    @Autowired MySessionBean mySessionBean;

    @Autowired MyRequestBean myRequestBean;

    @Test
    public void requestScope() throws Exception {
        assertThat(myRequestBean)
           .isSameAs(request.getAttribute("myRequestBean"));
        assertThat(myRequestBean)
           .isSameAs(wac.getBean("myRequestBean", MyRequestBean.class));
    }

    @Test
    public void sessionScope() throws Exception {
        assertThat(mySessionBean)
           .isSameAs(session.getAttribute("mySessionBean"));
        assertThat(mySessionBean)
           .isSameAs(wac.getBean("mySessionBean", MySessionBean.class));
    }
}

Использованная литература:

person MariuszS    schedule 30.01.2014
comment
После добавления WebAppConfiguration у меня возникла ошибка initializationError, которую я решил, добавив сервлет-api в файл pom, как указано здесь: nickebbitt.wordpress.com/2013/12/20/ - person borjab; 09.06.2014
comment
Совет: не используйте \ @WebAppConfiguration в сочетании с \ @IntegrationTest. У меня не работает - person Simon Ludwig; 01.12.2016