此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
测试请求范围和会话范围的 Bean
Spring 从早年开始就支持 Request-Scope 和 session-scoped bean,你可以测试你的 Request-scope 和 session-scoped bean 的 bean,请按照以下步骤作:
-
确保
WebApplicationContext
通过注释测试来加载测试 类与@WebAppConfiguration
. -
将模拟请求或会话注入测试实例并准备测试 适当的夹具。
-
调用从配置的
WebApplicationContext
(带有依赖注入)。 -
对模拟执行断言。
下一个代码片段显示了登录用例的 XML 配置。请注意,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
(即,下面的主语
test)和MockHttpServletRequest
到我们的测试实例中。在我们的requestScope()
test 方法,我们通过在
提供的MockHttpServletRequest
.当loginUser()
方法被调用在我们的userService
,我们确信用户服务可以访问请求范围的loginAction
对于当前MockHttpServletRequest
(也就是说,我们只是
设置参数)。然后,我们可以根据已知的
输入用户名和密码。以下列表显示了如何执行此作:
-
Java
-
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
}
}
以下代码片段类似于我们之前看到的请求范围的代码片段
豆。然而,这一次,userService
bean 依赖于 session-scopeduserPreferences
豆。请注意,UserPreferences
bean 是通过使用
从当前 HTTP 会话检索属性的 SpEL 表达式。
<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()
测试方法,我们通过以下方式设置我们的测试夹具
设置预期的theme
属性MockHttpSession
.当processUserPreferences()
方法被调用在我们的userService
,我们确信
用户服务有权访问会话范围的userPreferences
对于当前MockHttpSession
,我们可以根据
配置的主题。以下示例显示了如何执行此作:
-
Java
-
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
}
}