|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
测试请求作用域和会话作用域的 Bean
Spring 自早期版本起就已支持请求作用域和会话作用域的 Bean,您可以按照以下步骤测试您的请求作用域和会话作用域 Bean:
-
通过在测试类上添加
WebApplicationContext注解,确保为您的测试加载一个@WebAppConfiguration。 -
将模拟的请求或会话注入到您的测试实例中,并根据需要准备测试夹具。
-
调用您从已配置的
WebApplicationContext(通过依赖注入)中获取的 Web 组件。 -
对模拟对象执行断言。
下面的代码片段展示了登录用例的 XML 配置。请注意,userService bean 依赖于一个请求作用域(request-scoped)的 loginAction bean。此外,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中设置请求参数来搭建测试环境。当在userService上调用loginUser()方法时,我们可以确保用户服务能够访问当前MockHttpServletRequest的请求作用域loginAction(即我们刚刚设置了参数的那个)。然后,我们可以基于已知的用户名和密码输入对结果执行断言。以下清单展示了如何实现这一点:
-
Request-scoped bean test
-
Kotlin
@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
}
}
@SpringJUnitWebConfig
class RequestScopedBeanTests {
@Autowired lateinit var userService: UserService
@Autowired lateinit var request: MockHttpServletRequest
@Test
fun requestScope() {
request.setParameter("user", "enigma")
request.setParameter("pswd", "\$pr!ng")
val results = userService.loginUser()
// assert results
}
}
以下代码片段与我们之前看到的请求作用域(request-scoped)bean 的示例类似。但这一次,userService bean 依赖于一个会话作用域(session-scoped)的 userPreferences bean。请注意,UserPreferences bean 是通过使用 SpEL 表达式实例化的,该表达式从当前 HTTP 会话中获取主题(theme)。在我们的测试中,需要在 TestContext 框架所管理的模拟会话(mock session)中配置一个主题。以下示例展示了如何实现这一点:
<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 中设置预期的 theme 属性来搭建测试夹具。当在我們的 userService 上调用 processUserPreferences() 方法时,我们可以确保用户服务能够访问当前 MockHttpSession 的会话作用域 userPreferences,并且可以根据配置的主题对结果执行断言。以下示例展示了如何实现这一点:
-
Session-scoped bean test
-
Kotlin
@SpringJUnitWebConfig
class SessionScopedBeanTests {
@Autowired UserService userService;
@Autowired MockHttpSession session;
@Test
void sessionScope() throws Exception {
session.setAttribute("theme", "blue");
Results results = userService.processUserPreferences();
// assert results
}
}
@SpringJUnitWebConfig
class SessionScopedBeanTests {
@Autowired lateinit var userService: UserService
@Autowired lateinit var session: MockHttpSession
@Test
fun sessionScope() {
session.setAttribute("theme", "blue")
val results = userService.processUserPreferences()
// assert results
}
}