Бин области действия Spring Test с использованием Junit - PullRequest
32 голосов
/ 28 февраля 2011

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

Ответы [ 3 ]

30 голосов
/ 10 января 2012

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

<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/

30 голосов
/ 28 февраля 2011

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

  • зарегистрировать эти области в контексте приложения
  • создать фиктивный сеанс и запрос
  • зарегистрировать запрос макета через 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();
11 голосов
/ 30 января 2014

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));
    }
}

Рекомендации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...