Интеграционное тестирование в Spring: TestContext Framework, тестирование бинов области действия запроса и сеанса
Spring поддерживает bean-компоненты с областью действия запроса и сеанса (request- и session-scoped beans) еще с ранних релизов, и вы можете протестировать bean-компоненты с областью действия запроса и сеанса, выполнив следующие действия:
- Убедитесь, что WebApplicationContext загружен для вашего теста, аннотируя тестовый класс с помощью @WebAppConfiguration.
- Внедрите фиктивный (mock) запрос или сеанс в свой тестовый экземпляр и при необходимости подготовьте тестовое приспособление.
- Вызовите свой веб-компонент, полученный из настроенного контекста WebApplicationContext (с внедрением зависимостей).
- Выполняйте утверждения против моков.
Следующий фрагмент кода показывает конфигурацию XML для варианта использования входа (login). Обратите внимание, что bean-компонент userService зависит от bean-компонента loginAction в области запроса. Кроме того, LoginAction создается с помощью выражений SpEL, которые извлекают имя пользователя и пароль из текущего HTTP-запроса. В нашем тесте мы хотим настроить эти параметры запроса через мок, управляемый TestContext фреймворком. В следующем листинге показана конфигурация для этого варианта использования:
Конфигурация компонента с областью действия запроса
<beans>
<bean id="userService" class="com.example.SimpleUserService"
c:loginAction-ref="loginAction"/>
<bean id="loginAction" class="com.example.LoginAction"
c:username="#{request.getParameter('user')}"
c:password="#{request.getParameter('pswd')}"
scope="request">
<aop:scoped-proxy/>
</bean>
</beans>
В RequestScopedBeanTests мы внедряем как UserService (то есть испытуемый объект), так и MockHttpServletRequest в наш тестовый экземпляр. В нашем методе тестирования requestScope() мы настроили нашу тестовую фикстуру, установив параметры запроса в предоставленном MockHttpServletRequest. Когда метод loginUser() вызывается в нашей userService, мы уверены, что пользовательская служба (user service) имеет доступ к параметру loginAction в области запроса для текущего MockHttpServletRequest (то есть того, в котором мы только что установили параметры). Затем мы можем выполнять утверждения по результатам на основе известных входных данных для имени пользователя и пароля. В следующем листинге показано, как это сделать:
@SpringJUnitWebConfig
class RequestScopedBeanTests {
@Autowired UserService userService;
@Autowired MockHttpServletRequest request;
@Test
void requestScope() {
request.setParameter("user", "enigma");
request.setParameter("pswd", "$pr!ng");
LoginResults results = userService.loginUser();
// проверяем результаты
}
}
Следующий фрагмент кода похож на тот, который мы видели ранее для bean-компонента с областью действия запроса. Однако на этот раз bean-компонент userService зависит от bean-компонента userPreferences в области сеанса. Обратите внимание, что bean-компонент UserPreferences создается с помощью выражения SpEL, которое извлекает тему (theme) из текущего сеанса HTTP. В нашем тесте нам нужно настроить тему в фиктивной сессии, управляемой фреймворком TestContext. В следующем примере показано, как это сделать:
Конфигурация компонента с областью действия сеанса
<beans>
<bean id="userService" class="com.example.SimpleUserService"
c:userPreferences-ref="userPreferences" />
<bean id="userPreferences" class="com.example.UserPreferences"
c:theme="#{session.getAttribute('theme')}"
scope="session">
<aop:scoped-proxy/>
</bean>
</beans>
В SessionScopedBeanTests мы внедряем UserService и MockHttpSession в наш тестовый экземпляр. В нашем тестовом методе sessionScope() мы настроили нашу тестовую фикстуру, установив ожидаемый атрибут темы в предоставленном MockHttpSession. Когда метод processUserPreferences() вызывается в нашей userService, мы уверены, что пользовательская служба (user service) имеет доступ к userPreferences в области сеанса для текущего MockHttpSession, и мы можем выполнять утверждения по результатам на основе настроенной темы. В следующем примере показано, как это сделать:
@SpringJUnitWebConfig
class SessionScopedBeanTests {
@Autowired UserService userService;
@Autowired MockHttpSession session;
@Test
void sessionScope() throws Exception {
session.setAttribute("theme", "blue");
Results results = userService.processUserPreferences();
// проверяем результаты
}
}
Читайте также:
- Интеграционное тестирование в Spring: TestContext Framework, внедрение зависимостей тестовых приспособлений
- Интеграционное тестирование в Spring: TestContext Framework, кэширование контекста
- Интеграционное тестирование в Spring: TestContext Framework, иерархии контекстов
Комментарии
Отправить комментарий