Spring 从早年开始就支持请求范围和会话范围的 bean,您可以测试请求范围和会话范围 Bean 按照以下步骤操作:
-
通过批注测试来确保为测试加载 a 带有 .
WebApplicationContext
@WebAppConfiguration
-
将模拟请求或会话注入测试实例并准备测试 酌情使用夹具。
-
调用从配置的 Web 组件中检索到的 Web 组件(使用依赖项注入)。
WebApplicationContext
-
对模拟执行断言。
下一个代码片段显示了登录用例的 XML 配置。请注意,Bean 依赖于请求范围的 Bean。此外,使用 SpEL 表达式实例化
从当前 HTTP 请求中检索用户名和密码。在我们的测试中,我们希望
通过 TestContext 框架管理的 mock 配置这些请求参数。
以下列表显示了此用例的配置:userService
loginAction
LoginAction
<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>
在 中,我们注入了 (即
test) 并进入我们的测试实例。在我们的测试方法中,我们通过设置请求参数来设置测试夹具
提供的 .当我们的 调用该方法时,我们可以确保用户服务可以访问当前请求范围的请求(即我们刚刚在其中的那个
设置参数)。然后,我们可以根据已知的结果执行断言
用户名和密码的输入。以下列表显示了如何执行此操作:RequestScopedBeanTests
UserService
MockHttpServletRequest
requestScope()
MockHttpServletRequest
loginUser()
userService
loginAction
MockHttpServletRequest
-
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
}
}
以下代码片段类似于我们之前看到的请求范围的代码片段
豆。但是,这一次,Bean 依赖于会话范围的 Bean。请注意,Bean 是通过使用
SpEL 表达式,用于从当前 HTTP 会话中检索主题。在我们的测试中,我们
需要在 TestContext 框架管理的模拟会话中配置主题。这
以下示例演示如何执行此操作:userService
userPreferences
UserPreferences
<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
-
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
}
}