测试请求和会话作用域的 Bean
Spring 从早期就支持请求和会话作用域的 Bean,你可以按照以下步骤测试你的请求和会话作用域的 Bean
-
通过使用
@WebAppConfiguration
注解你的测试类,确保为你的测试加载了WebApplicationContext
。 -
将 mock 请求或会话注入到你的测试实例中,并根据需要准备你的测试夹具。
-
调用你从配置的
WebApplicationContext
中获取的 Web 组件(通过依赖注入)。 -
对 mock 进行断言。
下一个代码片段展示了一个登录用例的 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
(即我们刚刚设置了参数的那个)。然后,我们可以根据已知的用户名和密码输入对结果进行断言。以下清单展示了如何做到这一点
-
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
}
}
以下代码片段与我们之前看到的请求作用域 Bean 类似。但这次,userService
bean 依赖于一个会话作用域的 userPreferences
bean。请注意,UserPreferences
bean 是使用一个 SpEL 表达式实例化的,该表达式从当前 HTTP 会话中检索主题。在我们的测试中,我们需要在 TestContext 框架管理的 mock 会话中配置一个主题。以下示例展示了如何做到这一点
<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
,并且我们可以根据配置的主题对结果进行断言。以下示例展示了如何做到这一点
-
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
}
}