跳到主要内容
版本:7.0.3

测试请求范围和会话范围的Bean

Hunyuan 7b 中英对照 Testing Request- and Session-scoped Beans

从早期开始,Spring就支持[请求作用域(request-scoped)和会话作用域(session-scoped)的bean(参见../../core/beans/factory-scopes.md#beans-factory-scopes-other)了。你可以通过以下步骤来测试这些请求作用域和会话作用域的bean:

  • 通过在测试类上添加@WebAppConfiguration注解,确保为测试加载了WebApplicationContext

  • 将模拟的请求或会话注入到测试实例中,并根据需要准备测试 fixtures。

  • 调用从配置好的WebApplicationContext中获取的 Web 组件(通过依赖注入)。

  • 对模拟对象进行断言。

以下代码片段展示了用于登录用例的XML配置。请注意,userService bean依赖于一个请求范围内的loginAction bean。此外,LoginAction是通过使用SpEL表达式来实例化的,这些表达式从当前的HTTP请求中获取用户名和密码。在我们的测试中,我们希望通过TestContext框架管理的mock来配置这些请求参数。以下列表显示了该用例的配置:

<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中设置请求参数来配置测试环境。当在userService上调用loginUser()方法时,我们可以确保用户服务能够访问当前MockHttpServletRequest的请求作用域内的loginAction(也就是我们刚刚设置参数的那个)。然后,我们可以根据已知的用户名和密码输入来对结果进行断言。以下代码展示了如何实现这一点:

@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();
// assert results
}
}

以下代码片段与我们之前看到的请求作用域(request-scoped)bean类似。不过,这次UserService bean依赖于一个会话作用域(session-scoped)的userPreferences bean。需要注意的是,UserPreferences bean是通过使用SpEL表达式实例化的,该表达式从当前的HTTP会话中获取一个属性。

<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的会话范围(session-scoped)的userPreferences,并且可以根据配置的主题对结果进行断言。以下示例展示了如何实现这一点:

@SpringJUnitWebConfig
class SessionScopedBeanTests {

@Autowired UserService userService;
@Autowired MockHttpSession session;

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

Results results = userService.processUserPreferences();
// assert results
}
}