Интеграционное тестирование в 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();
        // проверяем результаты
    }
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки