У меня есть bean-компонент с ограниченным сеансом, который содержит пользовательские данные для каждого сеанса http. Я хотел бы написать тестовый пример Junit для тестирования bean-компонента с областью действия сеанса. Я хотел бы написать тестовый пример, чтобы он мог доказать, что bean-компоненты создаются за сеанс. Любой указатель на то, как написать такой тестовый пример Junit?
Бин области видимости сеанса Spring Test с использованием Junit
Ответы (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
Спасибо за подробное объяснение. Очень полезный.
- 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
То же самое применимо к области '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));
}
}
Использованная литература:
- Бины с заданной областью сеанса и запроса
- (SPR-4588)
- запросить компоненты с ограниченной областью видимости при весеннем тестировании
person
MariuszS
schedule
30.01.2014
После добавления WebAppConfiguration у меня возникла ошибка initializationError, которую я решил, добавив сервлет-api в файл pom, как указано здесь: nickebbitt.wordpress.com/2013/12/20/
- person borjab; 09.06.2014
Совет: не используйте \ @WebAppConfiguration в сочетании с \ @IntegrationTest. У меня не работает
- person Simon Ludwig; 01.12.2016