测试请求和会话作用域的 Bean

Infra 自早期以来一直支持 请求和会话作用域的 Bean,您可以按照以下步骤测试请求作用域和会话作用域的 Bean:

  • 通过使用 @WebAppConfiguration 注解测试类,确保为测试加载 WebApplicationContext

  • 将模拟请求或会话注入到测试实例中,并适当地准备测试夹具。

  • 调用从配置的 WebApplicationContext 中检索到的 Web 组件(通过依赖注入)。

  • 对模拟对象执行断言。

下一个代码片段显示了登录用例的 XML 配置。 请注意,userService Bean 依赖于请求作用域的 loginAction Bean。 此外,LoginAction 是使用 SpEL 表达式 实例化的,该表达式从当前 HTTP 请求中检索用户名和密码。 在我们的测试中,我们希望通过 TestContext 框架管理的模拟对象配置这些请求参数。 以下清单显示了此用例的配置:

请求作用域 Bean 配置
<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(即被测对象)和 HttpMockRequestImpl 注入到我们的测试实例中。 在我们的 requestScope() 测试方法中,我们通过在提供的 HttpMockRequestImpl 中设置请求参数来设置我们的测试夹具。 当在我们的 userService 上调用 loginUser() 方法时,我们可以确信用户服务可以访问当前 HttpMockRequestImpl(即我们刚刚设置参数的那个)的请求作用域 loginAction。 然后,我们可以根据已知的用户名和密码输入对结果执行断言。 以下清单显示了如何执行此操作:

  • 请求作用域 Bean 测试

@JUnitWebConfig
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 的代码片段类似。 但是,这一次,userService Bean 依赖于会话作用域的 userPreferences Bean。 请注意,UserPreferences Bean 是使用从当前 HTTP 会话中检索主题的 SpEL 表达式实例化的。 在我们的测试中,我们需要在 TestContext 框架管理的模拟会话中配置主题。 以下示例显示了如何执行此操作:

会话作用域 Bean 配置
<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 中,我们将 UserServiceMockHttpSession 注入到我们的测试实例中。 在我们的 sessionScope() 测试方法中,我们通过在提供的 MockHttpSession 中设置预期的 theme 属性来设置我们的测试夹具。 当在我们的 userService 上调用 processUserPreferences() 方法时,我们可以确信用户服务可以访问当前 MockHttpSession 的会话作用域 userPreferences,并且我们可以根据配置的主题对结果执行断言。 以下示例显示了如何执行此操作:

  • 会话作用域 Bean 测试

@JUnitWebConfig
class SessionScopedBeanTests {

  @Autowired UserService userService;
  @Autowired MockHttpSession session;

  @Test
  void sessionScope() throws Exception {
    session.setAttribute("theme", "blue");

    Results results = userService.processUserPreferences();
    // 断言结果
  }
}